Android 11 DialogFragment width设置无效的问题
项目中有一个需求是弹窗展示内容,弹窗从屏幕底部弹出,宽度铺满屏幕宽度,代码如下:
.
.
.
override fun onStart() {
super.onStart()
setStyle(STYLE_NO_TITLE, R.style.MyDialogStyleX)
dialog?.let {
it.window?.run {
attributes.gravity = Gravity.BOTTOM
attributes.width = WindowManager.LayoutParams.MATCH_PARENT
attributes.height = WindowManager.LayoutParams.WRAP_CONTENT
setWindowAnimations(R.style.DialogAnimation)
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
}
it.setCanceledOnTouchOutside(false)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mBinding = DialogTopicMoreBinding.inflate(inflater, container, false)
.
.
.
return mBinding.root
}
.
.
.
MyDialogStyleX xml代码:
<style name="MyDialogStyleX" parent="BlurDialog">
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.6</item>
</style>
BlurDialog xml:
<style name="BlurDialog" parent="android:Theme.Dialog"/>
BlurDialog values-v31:
<style name="BlurDialog" parent="android:Theme.Dialog">
<item name="android:windowBackgroundBlurRadius">10dp</item>
<item name="android:windowBlurBehindEnabled">true</item>
<item name="android:windowBlurBehindRadius">10dp</item>
</style>
然而测试时发现,除android 11之外,dialog的宽度都可以铺满屏幕宽度,在android 11上面是这样的:
弹窗两侧并没有充满屏幕宽度。后来经过百度、谷歌均没有解决问题,突然想到我之前用java写过一个DialogFragment的弹窗,测试一看宽度居然可以铺满屏幕宽,经过对比代码发现,修改这2个地方就可以了: 1.把这段代码
setStyle(STYLE_NO_TITLE, R.style.MyDialogStyleX)
放到 oncreate里面
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.MyDialogStyleX)
}
2.MyDialogStyleX中添加windowbackground,并设置为透明
<style name="MyDialogStyleX" parent="BlurDialog">
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.6</item>
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
</style>
这次ok了,结果如图: 这样在各个android 版本下都可以铺满屏幕宽度了。
其实使用AlertDialog就不会出现这种问题。 具体原因我实在查不出来,有知道的同学请告知一下!
|