Android系统栏显示时如何调整UI避免内容遮挡
解决系统栏显示时遮挡应用内容的方案
一、基础配置:让布局自动适配系统栏
先给布局根节点添加属性,让系统自动处理内边距,避免系统栏直接覆盖内容:
android:fitsSystemWindows="true"
或者在代码中设置布局延伸标记,确保布局能延伸到系统栏区域,同时系统会自动给根布局补内边距:
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
二、监听系统栏变化,动态调整视图内边距
如果需要精细控制特定视图的位置,可通过OnApplyWindowInsetsListener监听系统栏的显示/隐藏,实时获取系统栏高度并调整视图内边距:
ViewCompat.setOnApplyWindowInsetsListener(rootView) { view, insets -> // 获取状态栏、导航栏的实际高度 val statusBarHeight = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top val navBarHeight = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom // 给顶部视图设置顶部内边距,避开状态栏 topView.setPadding(topView.paddingLeft, statusBarHeight, topView.paddingRight, topView.paddingBottom) // 给底部视图设置底部内边距,避开导航栏 bottomView.setPadding(bottomView.paddingLeft, bottomView.paddingTop, bottomView.paddingRight, navBarHeight) return@setOnApplyWindowInsetsListener insets }
三、添加动画过渡,让视图随系统栏平滑移动
要实现系统栏显示/隐藏时的视图动画,可结合Insets监听触发动画:
// Android 12+推荐的新API方式 WindowCompat.addWindowInsetsListener(window.decorView) { _, insets -> val isStatusBarVisible = insets.isVisible(WindowInsetsCompat.Type.statusBars()) val statusBarHeight = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top // 顶部视图随状态栏显示/隐藏平滑平移 topView.animate() .translationY(if (isStatusBarVisible) statusBarHeight.toFloat() else 0f) .setDuration(200) .start() return@addWindowInsetsListener insets }
四、主动查询系统栏可见性状态
如果需要主动判断系统栏是否显示,可直接调用InsetsController的方法:
// 查询状态栏可见性 val isStatusBarVisible = WindowCompat.getInsetsController(window, window.decorView) .isVisible(WindowInsetsCompat.Type.statusBars()) // 查询导航栏可见性 val isNavBarVisible = WindowCompat.getInsetsController(window, window.decorView) .isVisible(WindowInsetsCompat.Type.navigationBars())
内容的提问来源于stack exchange,提问作者Groot
相关产品推荐
相关产品推荐

