Android Layout不显示或显示在原有布局下方问题求助
1. 加载屏无法显示
你将loading布局放在了homelayout(ConstraintLayout)的第一个子节点,ConstraintLayout的子View绘制顺序和XML声明顺序完全一致,后声明的Toolbar、main_container层级更高,会直接覆盖在loading布局上层,就算将loading设为VISIBLE也会被下方的View遮挡,无法被用户看到。
另外你当前的homelayout宽高设置为wrap_content,可能存在主内容区无法撑满全屏的问题。
2. 车辆列表Fragment显示在下层
DrawerLayout有固定的子View层级规则:
- 第一个子View默认为主内容区域,绘制层级为最低
- 后续子View如果配置了
android:layout_gravity属性,会被识别为侧边抽屉,绘制层级高于主内容区 - 后续子View如果没有配置
android:layout_gravity属性,绘制层级会比主内容区更低
你写的select_vehicle_layout属于DrawerLayout的第三个子View,没有配置layout_gravity属性,因此绘制层级比主内容区还低,Fragment加载进去后自然会被主内容区挡住,无法显示。
1. 修复加载屏显示问题
调整homelayout内的子View顺序,将loading布局移到最后一位,确保它的层级最高,同时修改homelayout的宽高为match_parent:
<androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/homelayout" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:minHeight="?attr/actionBarSize" android:background="@color/transparent" android:layout_width="match_parent" android:layout_height="wrap_content" app:menu="@menu/top_bar_menu" app:titleTextColor="@color/gainsboro_00" app:layout_constraintTop_toTopOf="parent"> <TextView android:id="@+id/toolbar_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAlignment="center" android:text="@string/loading_car" android:textColor="@color/gainsboro_00" android:letterSpacing="0.5" android:textAllCaps="true" android:gravity="center" android:clickable="true" android:focusable="true"/> </androidx.appcompat.widget.Toolbar> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/main_container" android:layout_width="match_parent" android:layout_height="0dp" android:orientation="vertical" app:layout_constraintTop_toBottomOf="@+id/toolbar" app:layout_constraintBottom_toBottomOf="parent"/> <!-- loading移到最后,层级最高 --> <include android:id="@+id/loading" android:visibility="gone" layout="@layout/layout_loading"/> </androidx.constraintlayout.widget.ConstraintLayout>
2. 修复车辆列表Fragment层级问题
推荐采用方案一,逻辑更符合常规布局规范:
方案一:将select_vehicle_layout移到主内容区内部
将select_vehicle_layout从DrawerLayout的子节点移动到homelayout内部的最后一位,保证它的层级高于所有主内容元素,同时将初始visibility改为gone减少性能消耗:
<androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/homelayout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 原有Toolbar、main_container、loading配置不变 --> <!-- 新增车辆列表容器,层级最高 --> <FrameLayout android:id="@+id/select_vehicle_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" /> </androidx.constraintlayout.widget.ConstraintLayout>
修改完成后删除DrawerLayout中原来的select_vehicle_layout节点即可,原有Fragment加载逻辑不需要修改。
方案二:给现有select_vehicle_layout加layout_gravity属性(仅兼容场景使用)
如果不想调整布局结构,可以直接给DrawerLayout中的select_vehicle_layout添加android:layout_gravity="end"属性,让DrawerLayout将它识别为抽屉类View,绘制层级高于主内容区,显示时就不会被遮挡。
内容的提问来源于stack exchange,提问作者Seb

