如何为Fragment设置全屏深色遮罩(含状态栏与导航栏)
解决Fragment遮罩无法覆盖状态栏和底部导航栏的问题
嘿,我来帮你搞定这个遮罩覆盖不全的问题!你遇到的情况是因为默认情况下,你的ImageView遮罩没有延伸到系统状态栏和底部导航栏的区域,下面给你两种靠谱的解决方法:
方法一:通过WindowInsets让遮罩适配系统栏
这种方法会让你的遮罩View主动适配系统栏的Insets,从而覆盖到状态栏和导航栏:
- 首先在你的Fragment布局里,把遮罩View(可以是ImageView或者普通View)设置为match_parent,背景设为
#B3000000(也就是alpha=0.7的黑色),并且放在布局的最顶层:
<View android:id="@+id/mask_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#B3000000" android:visibility="gone" />
- 然后在Fragment的
onViewCreated方法里,添加WindowInsets的处理逻辑:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val maskView = view.findViewById<View>(R.id.mask_view) maskView.setOnApplyWindowInsetsListener { v, insets -> val params = v.layoutParams as ViewGroup.MarginLayoutParams // 给遮罩View加上状态栏和导航栏的Insets边距,让它延伸进去 params.topMargin = insets.systemWindowInsetTop params.bottomMargin = insets.systemWindowInsetBottom v.layoutParams = params // 消费掉Insets,避免影响其他View insets.consumeSystemWindowInsets() } // 显示遮罩的时候调用 maskView.visibility = View.VISIBLE }
方法二:设置窗口透明,让遮罩直接延伸到系统栏
这种方法是把状态栏和导航栏设置为透明,让你的遮罩View直接覆盖整个屏幕:
- 同样先确保遮罩View是match_parent且在布局顶层,然后在Fragment的
onViewCreated里配置窗口:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val window = requireActivity().window // 让窗口布局延伸到状态栏和导航栏下方 window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // 设置状态栏和导航栏为透明 window.statusBarColor = Color.TRANSPARENT window.navigationBarColor = Color.TRANSPARENT // 显示遮罩 view.findViewById<View>(R.id.mask_view).visibility = View.VISIBLE }
这样设置后,你的深色遮罩就能完美覆盖整个Fragment对应的屏幕区域,包括状态栏和底部导航栏啦!
内容的提问来源于stack exchange,提问作者AmirH Ramezani
相关产品推荐
相关产品推荐

