原因是 window 的 DecorView 与 我们 XML 内的 View 之间的有一级ViewGroup
它默认会有OnApplyWindowInsetsListener
的响应,也会在创建完 Dialog 后设置默认背景色。
背景色无法修改
这个问题是写带圆角的底部弹窗的时候发现的
背景色具体的设置时间点很晚,测试发现需要在显示出来之后才可以进行覆盖
requireDialog().setOnShowListener(dialog -> ((ViewGroup) view.getParent()).setBackgroundColor(Color.TRANSPARENT));
导航栏颜色透明
这个问题确实不影响使用,但是在了解 WindowInset 相关知识后,觉得可以做得更好
WindowInset 可以从父布局进行拦截,因为响应这个变化的 ViewGroup 是 DecorView 的子View,所以这里我们可以对 DecorView 设置监听,在内部对我们 XML 的布局进行适配,然后消耗掉 Inset。
// Edge to edge
ViewCompat.setOnApplyWindowInsetsListener(requireDialog().getWindow().getDecorView(), (v, insets) -> {
Insets inset = insets.getInsets(WindowInsetsCompat.Type.systemBars());
mBinding.getRoot().setPadding(inset.left, 0, inset.right, inset.bottom);
return WindowInsetsCompat.CONSUMED;
});
网友评论