我认为标题非常明确我的问题......所以这是我的布局:
<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,但它并没有改变任何内容。所以我想知道它是否必须处理高程。
先谢谢你们
马修
答案 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
相关联。如果两者 小部件具有相同的elevation
,RelativeLayout
将确定 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
。