Android带图片的Prominent AppBar状态栏适配问题求助
解决Fragment中带图Prominent AppBar延伸状态栏且折叠不遮挡的问题
问题场景
在Fragment中使用带图片的Prominent AppBar,想要让AppBar的图片延伸至状态栏,设置FLAG_LAYOUT_NO_LIMITS后图片显示正常,但折叠Toolbar时,标题和导航图标会被状态栏遮挡;移除该标志则图片无法延伸到状态栏,尝试android:windowDrawsSystemBarBackgrounds、android:windowTranslucentStatus、android:fitsSystemWindows等属性均未解决。
解决方案
1. 移除Activity中的FLAG_LAYOUT_NO_LIMITS设置
删掉Activity的onCreate中设置的以下代码:
getWindow().setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS );
2. 更新Theme配置(theme.xml)
在主题中添加状态栏透明和允许绘制系统栏背景的属性,保留原有颜色配置:
<resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.MainTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 原有颜色配置 --> <item name="colorPrimary">@color/DeepSkyBlue</item> <item name="colorPrimaryVariant">@color/DeepSkyBlueVariant</item> <item name="colorOnPrimary">@color/white</item> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_700</item> <item name="colorOnSecondary">@color/purple_500</item> <!-- 更新状态栏相关属性 --> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:windowTranslucentStatus">true</item> <!-- 适配Android 11+的状态栏图标颜色 --> <item name="android:windowLightStatusBar">false</item> </style> </resources>
3. 调整AppBar相关布局的fitsSystemWindows属性
- 修改
fragment_add_person.xml,给CoordinatorLayout添加android:fitsSystemWindows="true":
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <include android:id="@+id/layoutAppBar" layout="@layout/layout_app_bar_prominent" /> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" /> </androidx.core.widget.NestedScrollView> </androidx.coordinatorlayout.widget.CoordinatorLayout>
- 修改
layout_app_bar_prominent.xml,给AppBarLayout和CollapsingToolbarLayout、ImageView添加android:fitsSystemWindows="true":
<?xml version="1.0" encoding="utf-8"?> <com.google.android.material.appbar.AppBarLayout android:id="@+id/app_bar_layout" android:layout_width="match_parent" android:layout_height="@dimen/app_bar_height_image_view" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:fitsSystemWindows="true"> <com.google.android.material.appbar.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed" app:contentScrim="?attr/colorPrimary" app:collapsedTitleTextColor="?attr/colorOnPrimary" app:expandedTitleTextColor="?attr/colorOnPrimary" android:fitsSystemWindows="true"> <ImageView android:id="@+id/expandedImage" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.7" android:contentDescription="@string/app_bar_expanded_image" android:fitsSystemWindows="true" /> <com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:navigationIcon="?attr/homeAsUpIndicator" /> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout>
4. 动态调整Toolbar内边距(可选,适配特殊机型)
如果部分机型仍存在遮挡,在Fragment的onViewCreated中动态给Toolbar添加顶部内边距适配状态栏高度:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); MaterialToolbar toolbar = view.findViewById(R.id.toolbar); // 获取状态栏高度 int statusBarHeight = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = getResources().getDimensionPixelSize(resourceId); } // 给Toolbar添加顶部内边距 toolbar.setPadding(toolbar.getPaddingLeft(), statusBarHeight, toolbar.getPaddingRight(), toolbar.getPaddingBottom()); }
原理说明
通过android:fitsSystemWindows="true"让布局系统自动处理状态栏内边距,结合主题中透明状态栏的配置,既实现图片延伸至状态栏的效果,又保证Toolbar折叠时内容不会被状态栏遮挡,无需使用FLAG_LAYOUT_NO_LIMITS打破原有布局约束。
内容的提问来源于stack exchange,提问作者Savan Luffy
相关产品推荐
相关产品推荐

