Android XML布局点击按钮层级错乱 如何固定两个Button的上下层级
问题原因
Android 5.0及以上系统中,Button默认自带stateListAnimator属性,点击时会自动提升Z轴高度(elevation),导致被点击的控件层级动态升高,覆盖其他重叠控件。
解决方案
方案1:禁用按钮默认的状态动画(最快捷)
直接给两个按钮都添加android:stateListAnimator="@null"属性,关掉点击时的Z轴变化,XML的绘制顺序就会固定:默认XML中后定义的控件层级更高,你现有代码里button1写在前面、button2写在后面,加完这个属性后button2就会始终在上层。
修改后的按钮代码示例:
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="84dp" android:background="@drawable/empty_yellow_circle" android:text="1" android:stateListAnimator="@null" app:backgroundTint="@null" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/button2" android:layout_width="70dp" android:layout_height="70dp" android:layout_marginStart="76dp" android:layout_marginTop="48dp" android:background="@drawable/full_yellow_circle" android:text="2" android:stateListAnimator="@null" app:backgroundTint="@null" app:layout_constraintBottom_toBottomOf="@+id/button1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.558" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/button1" app:layout_constraintVertical_bias="1.0" />
方案2:手动固定Z轴层级
如果你需要保留按钮的点击动效,不想禁用stateListAnimator,可以直接给按钮设置固定的Z轴高度,让button2的Z值始终高于button1即可:
- 给button1添加:
android:elevation="2dp" - 给button2添加:
android:elevation="4dp"
Z轴数值越大层级越高,点击时的动效也不会改变固定的层级差。
方案3:代码动态控制层级
如果需要在运行时动态调整层级,可以调用控件的bringToFront()方法强制将指定控件放到最上层,调用后需要调用父布局的requestLayout()和invalidate()刷新布局:
// 确保button2始终在上层 button2.bringToFront(); parentLayout.requestLayout(); parentLayout.invalidate();
Kotlin写法逻辑同理。
内容的提问来源于stack exchange,提问作者Amin Kadkhodaee
相关产品推荐
相关产品推荐

