【问题标题】:Android 5.0 - ProgressBar cannot be displayed over a ButtonAndroid 5.0 - ProgressBar 不能显示在按钮上
【发布时间】:2014-10-23 08:57:01
【问题描述】:

我认为标题对我的问题非常明确......所以这是我的布局:

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <Button
                    android:id="@+id/button_action"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Login" />

                <ProgressBar
                    android:id="@+id/progress_bar"
                    android:layout_width="50dp"
                    android:layout_height="50dp"
                    android:layout_centerInParent="true"/>

            </RelativeLayout>

在 android SDKs 在按钮之后。

因此,当您在开发人员选项设置中激活“显示布局边界”选项时,您可以看到它已正确定位,但如果没有该选项,您将看不到屏幕上的任何内容。

有人知道如何解决这个问题吗?我猜这是最近引入的海拔问题,但我真的不知道如何处理它。 作为记录,我使用的是 support.v7 中最近发布的 Theme.AppCompat 样式。

编辑:

我还尝试以编程方式将setElevation(0)setTranslationY(0) 应用于Button,但它没有改变任何东西。所以我想知道它是否必须处理海拔。

【问题讨论】:

  • 你有什么理由不用FrameLayout
  • 不,不是。我猜只是习惯问题。它能改变什么吗?
  • @ViewMa,是的。请看我的回答。

标签: android android-button android-progressbar android-5.0-lollipop


【解决方案1】:

您可以将android:translationZ 属性添加到ProgressBar

<ProgressBar
    android:id="@+id/progress_bar"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:translationZ="2dp"
    android:layout_centerInParent="true"/>

【讨论】:

  • 感谢您的回答 wpiwonski,但不,没有任何改变
  • 这很奇怪。我检查了模拟器上的代码,ProgressBar 现在在按钮上。 1 dp 不够,但 2 dp 将 ProgressBar 移到最前面。
  • 我的错误,我试图将Button的translationZ设置为0而不是增加ProgressBar的。确实有效,谢谢!
  • 注意它的 API 21+
  • 在 API 30 上测试,“2dp”对我不起作用,但“4dp”对我有用!
【解决方案2】:

同样的问题,我的简单“hack”也将 Button 包装到另一个 FrameLayout 中。 这样我就不关心 api 版本和其他提升问题;)

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center" >

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
                <Button
                    android:id="@+id/button_action"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Login" />
        </FrameLayout>

        <ProgressBar
            android:id="@+id/progress_bar"
            android:layout_width="50dp"
            android:layout_height="50dp" />
</FrameLayout>

【讨论】:

    【解决方案3】:

    这里提出了同样的问题,对这个问题有更好的解释:

    https://stackoverflow.com/a/27216368/235910

    引用@CommonsWare:

    问题出现在 Android 5.0 的 elevation 属性上。显然, RelativeLayout Z 轴排序绑定到 elevation。如果两者 小部件具有相同的elevationRelativeLayout 将确定 Z轴顺序——你可以看到如果你要切换你的布局 例如,既是Button 小部件。但是,如果一个小部件 (Button) 有一个 elevation,另一个小部件 (ImageView) 有 不是,elevation 将优先。

    您可以通过以下方式删除 Button elevation android:stateListAnimator="@null"defining your own custom animator。或者,您可以将一些 elevation 添加到您的 ImageView 到 让它在 Z 轴上高于 Button

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    【解决方案4】:

    最好设置android:translationZ大于2dp。当您按下按钮时,您的视图/小部件将消失。我解释了原因here

    <!-- Elevation when button is pressed -->
    <dimen name="button_elevation_material">1dp</dimen>
    <!-- Z translation to apply when button is pressed -->
    <dimen name="button_pressed_z_material">2dp</dimen>
    

    按钮有这两个值并在framework中定义。

    【讨论】:

      【解决方案5】:

      如果您将“androidx.core:core”添加到您的 build.gradle,您可以将此代码用于 API

      ViewCompat.setTranslationZ(viewToElevate, 5);
      

      【讨论】:

        【解决方案6】:

        默认情况下,如果要在 Button 顶部显示视图,则它的高度至少应为 2dp。

        这是由于按钮的高度是由它们的 stateListAnimator 控制的。只要它有一个,将高度设置为按钮本身就不会做任何事情。 Widget.MaterialComponents.Button 的 stateListAnimator 的默认高程为 @dimen/mtrl_btn_elevation (2dp),因此这是您必须考虑的高程。

        执行android:stateListAnimator="@null" 也可以,但这会消除按钮上的任何阴影效果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-16
          相关资源
          最近更新 更多