Toolbar被状态栏遮挡,设置android:fitsSystemWindows无效求解决方案
遇到这种情况挺常见的,我来给你几个可行的解决方案,你可以逐个试试:
1. 先确认App主题的配置是否正确
这是最容易被忽略的关键点:如果你的App主题自带默认ActionBar,会和手动设置的Toolbar产生布局冲突,直接导致fitsSystemWindows属性失效。
打开styles.xml(或themes.xml),确保主题继承自不带默认ActionBar的类型,比如:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- 其他主题属性,比如你的Toolbar颜色 --> <item name="colorPrimary">@color/colorToolbar</item> </style>
同时要保证AndroidManifest.xml里的HomeActivity使用了这个主题:
<activity android:name=".Home" android:theme="@style/AppTheme">
2. 给Toolbar添加状态栏高度的顶部内边距
如果主题没问题,可以直接给Toolbar设置适配状态栏的顶部内边距,用系统内置的属性自动适配不同设备的状态栏高度:
修改activity_home.xml中的Toolbar代码:
<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorToolbar" android:elevation="10dp" android:paddingTop="?attr/statusBarHeight" android:minHeight="?attr/actionBarSize" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toTopOf="@id/viewpager"> </androidx.appcompat.widget.Toolbar>
这里?attr/statusBarHeight会自动获取系统状态栏的高度,android:minHeight="?attr/actionBarSize"能保证Toolbar的最低高度符合ActionBar的规范。
3. 用WindowInsets动态处理布局(推荐方案)
如果上面的方法还是没效果,可以通过代码监听系统的WindowInsets,动态给Toolbar添加适配状态栏的内边距,这个方法适配性最强:
修改HomeActivity.kt的onCreate方法:
class Home : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_home) setSupportActionBar(toolbar) toolbar.inflateMenu(R.menu.menu_home) // 动态处理状态栏内边距 ViewCompat.setOnApplyWindowInsetsListener(toolbar) { view, insets -> val statusBarInsets = insets.getInsets(WindowInsetsCompat.Type.statusBars()) view.setPadding(view.paddingLeft, statusBarInsets.top, view.paddingRight, view.paddingBottom) insets } } override fun onCreateOptionsMenu(menu: Menu?): Boolean { val inflater: MenuInflater = menuInflater inflater.inflate(R.menu.menu_home, menu) return true } }
这个方法会自动识别当前设备的状态栏高度,给Toolbar添加对应的顶部内边距,完美解决遮挡问题。
4. 调整根布局的fitsSystemWindows属性
你已经给根ConstraintLayout加了android:fitsSystemWindows="true",但有时候这个属性在ConstraintLayout里需要配合其他设置生效,你可以尝试把这个属性移到Toolbar本身上:
<androidx.appcompat.widget.Toolbar ... android:fitsSystemWindows="true" ...> </androidx.appcompat.widget.Toolbar>
建议你先从主题检查开始排查,因为大部分这类问题都是主题配置冲突导致的,再依次尝试其他方法。
内容的提问来源于stack exchange,提问作者Zorgan

