Android中DialogFragment弹出后白色背景状态栏文字不可见如何解决
问题根因
- DialogFragment弹出时其持有的Window会成为顶层Window,默认会覆盖下层Activity的状态栏样式配置
- 你的宿主Activity已配置**浅色状态栏(深色文字)**适配白色背景,但Dialog的Window默认未继承该配置,遵循系统默认的深色状态栏规则(白色文字)
- 你虽设置了Dialog Window背景透明、遮罩透明度为0,但状态栏文字已经被切换为白色,和下层白色状态栏背景重叠,就出现了文字不可见的问题
解决方案
只需在Dialog的Window配置中增加和宿主Activity一致的状态栏样式配置即可,修改后的完整代码如下:
class LoadingDialog(var message: String? = null) : DialogFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View { val binding = LoadingViewBinding.inflate(inflater, container, false) val tvContent = binding.loadingViewTvContent if (!message.isNullOrEmpty()) { tvContent.text = message } dialog?.window?.apply { setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) setDimAmount(0f) //完全透明 // 新增:和宿主Activity保持一致的状态栏配置 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { statusBarColor = Color.TRANSPARENT } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 保持浅色状态栏(文字为深色),和下层Activity配置一致 decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR } } return binding.root } override fun onStart() { super.onStart() isCancelable = false //点击外部不可取消 val dm = DisplayMetrics() this.activity?.windowManager?.defaultDisplay?.getMetrics(dm) this.dialog?.window?.setLayout(dm.widthPixels, dm.heightPixels) } }
如果你的项目适配了Android 11及以上版本,用新版WindowInsetsControllerAPI替代systemUiVisibility配置即可,逻辑保持一致:让Dialog的Window状态栏样式完全对齐宿主Activity配置。
内容的提问来源于stack exchange,提问作者shao_g
相关产品推荐
相关产品推荐

