横屏模式下如何为UI添加内边距以避开显示刘海区域?

我希望底部导航栏保持原有长度不变,同时给左侧的容器添加内边距,让卡片向右偏移一些。当前我的MainActivity.kt中有如下代码:
WindowCompat.setDecorFitsSystemWindows(window, false) ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) view.updateLayoutParams<ViewGroup.MarginLayoutParams> { topMargin = insets.top } binding.bottomNavigationView.updatePadding(bottom = insets.bottom) WindowInsetsCompat.CONSUMED }
我的activity_main.xml由一个ConstraintLayout构成,其中包含两个元素:BottomNavigationView和FragmentContainerView。
解决方案
要实现需求,只需在现有WindowInsets处理逻辑中,给FragmentContainerView添加左侧内边距即可,底部导航栏的处理逻辑保持不变:
WindowCompat.setDecorFitsSystemWindows(window, false) ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) view.updateLayoutParams<ViewGroup.MarginLayoutParams> { topMargin = insets.top } // 给左侧容器添加内边距,调整偏移量(示例用16dp,可按需修改) binding.fragmentContainerView.updatePadding(left = dpToPx(16)) binding.bottomNavigationView.updatePadding(bottom = insets.bottom) WindowInsetsCompat.CONSUMED } // 辅助函数:dp转px private fun dpToPx(dp: Int): Int { return (dp * resources.displayMetrics.density).toInt() }
如果需要适配挖孔/刘海屏幕,让卡片自动避开系统显示区域,可以改用显示挖孔的内边距:
WindowCompat.setDecorFitsSystemWindows(window, false) ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) view.updateLayoutParams<ViewGroup.MarginLayoutParams> { topMargin = insets.top } // 获取挖孔区域的左侧内边距,自动适配偏移 val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout()) binding.fragmentContainerView.updatePadding(left = cutoutInsets.left) binding.bottomNavigationView.updatePadding(bottom = insets.bottom) WindowInsetsCompat.CONSUMED }
这样既不会改变底部导航栏的长度,又能让左侧容器内的卡片向右偏移到你需要的位置。
内容的提问来源于stack exchange,提问作者dem
相关产品推荐
相关产品推荐

