Android CoordinatorLayout实现FrameLayout置于所有视图底层
嘿,这个问题我熟!在CoordinatorLayout里实现类似Web中z-index的层级控制,其实不用你试的那些ConstraintLayout或RelativeLayout属性,因为CoordinatorLayout遵循ViewGroup的核心层级规则,很容易搞定。
核心解决方案:调整布局编写顺序
CoordinatorLayout作为ViewGroup,子视图的层级完全由编写顺序决定:写在最前面的视图会默认处于底层,后面添加的视图会自动覆盖在它之上。这是Android所有ViewGroup的通用规则,也是最直接的“z-index”实现方式。你只需要把承载相机预览的
containerFrameLayout放在CoordinatorLayout的第一个子节点位置,后续所有需要显示在它上方的控件/布局都写在它之后就行。示例代码如下:<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 放在最顶部,作为底层容器(相机预览) --> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"/> <!-- 以下所有视图都会自动显示在相机预览之上 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="相机预览上方的文本"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:padding="16dp" android:background="#80000000"> <!-- 底部操作栏控件 --> </LinearLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>特殊情况处理:检查elevation属性
如果调整顺序后还是有视图无法覆盖container,那大概率是某些视图设置了android:elevation(或app:elevation)属性。这个属性会让视图拥有阴影层级,强制显示在更高层。解决方法很简单:要么移除其他视图的elevation设置,要么给
container设置一个更低的elevation值(比如android:elevation="0dp",默认就是0,但如果其他视图有正数值,确保container的数值更小)。为什么之前的方法无效?
你尝试的android:layout_below/above是RelativeLayout专属属性,CoordinatorLayout不支持;app:layout_constraintVertical_bias则是ConstraintLayout的属性,同样不适用于CoordinatorLayout,所以这些设置自然不会生效。
内容的提问来源于stack exchange,提问作者Richard

