Android 5.0 - ProgressBar无法在Button上显示

时间:2014-10-23 08:57:01

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

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

            <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 SDK上&lt; 21,没问题,ProgressBar正确显示在Button上并以Button为中心。但在Android 5.0上,ProgressBar显示在后面按钮。

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

有人知道如何解决这个问题吗?我想这是最近推出的提升问题,但我真的不知道如何处理它。 为了记录,我使用了support.v7中最近发布的Theme.AppCompat样式。

修改

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

先谢谢你们

马修

7 个答案:

答案 0 :(得分:51)

您可以在ProgressBar中使用android:translationZ属性:

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

答案 1 :(得分:8)

同样的问题,我的简单&#34; hack&#34;太将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>

答案 2 :(得分:5)

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

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

答案 3 :(得分:0)

最好将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中定义。

答案 4 :(得分:0)

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

ViewCompat.setTranslationZ(viewToElevate, 5);

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:-1)

可能最简单的方法是使用FrameLayout,因为它是为了制作其子视图按z-index排序的布局:

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

            <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" />
    </FrameLayout>

我不确定您的布局是什么样的,所以也许您需要使用android:layout_gravity