Android特定Fragment修改状态栏颜色的问题解决
解决方案
一、修复布局覆盖导航栏的问题
不要使用FLAG_LAYOUT_NO_LIMITS标记(它会让布局同时延伸到状态栏和导航栏),改用以下方式实现仅覆盖状态栏:
- 在HomeFragment的
onViewCreated中配置状态栏与布局适配:// 允许布局绘制到状态栏区域,但不影响导航栏 WindowCompat.setDecorFitsSystemWindows(requireActivity().window, false) // 设置状态栏为紫色 requireActivity().window.statusBarColor = ContextCompat.getColor(requireContext(), R.color.purple) // 给根布局添加顶部padding,避免内容被状态栏遮挡 val rootView = binding.root ViewCompat.setOnApplyWindowInsetsListener(rootView) { view, insets -> val statusBarInsets = insets.getInsets(WindowInsetsCompat.Type.statusBars()) view.setPadding(0, statusBarInsets.top, 0, 0) insets } - 彻底移除之前添加/清除
FLAG_LAYOUT_NO_LIMITS的代码。
二、确保其他Fragment状态栏为白色
- 先取消给MainActivity设置
Theme.ActivityStatusBarPurple,让MainActivity保持使用基础的AppStyle(默认状态栏为白色)。 - 在HomeFragment的
onDestroyView中恢复默认状态栏配置:// 恢复布局不延伸到状态栏 WindowCompat.setDecorFitsSystemWindows(requireActivity().window, true) // 恢复状态栏为白色(若AppStyle中已配置,也可通过主题属性获取默认值) requireActivity().window.statusBarColor = ContextCompat.getColor(requireContext(), R.color.white) // 清除根布局的Insets监听 ViewCompat.setOnApplyWindowInsetsListener(binding.root, null)
补充优化
如果希望更贴合主题配置,恢复状态栏颜色时可以直接读取AppStyle的默认值:
val typedValue = TypedValue() requireActivity().theme.resolveAttribute(android.R.attr.statusBarColor, typedValue, true) requireActivity().window.statusBarColor = typedValue.data
内容的提问来源于stack exchange,提问作者Alexey Simchenko
相关产品推荐
相关产品推荐

