Kotlin中调整DialogFragment大小并解决点击外部无法正常关闭问题
问题根因
- 点击外部区域只有部分位置能关闭:你布局文件的根LinearLayout宽高均设置为
match_parent,直接撑满了Dialog的整个Window区域,只有布局未覆盖的极边缘区域才会被识别为「外部点击区域」,因此只有点击这些位置才能触发关闭。 - 调整大小不生效:你没有重写DialogFragment的
onStart生命周期方法配置Window参数,默认Dialog会按照布局自适应的规则展示,常规调整大小的配置都需要在该方法内对Dialog所属的Window进行修改。
解决步骤
- 修改布局文件:将根节点LinearLayout的宽高修改为
wrap_content,也可以根据需求设置固定dp值,不要使用match_parent:
<LinearLayout android:layout_width="320dp" <!-- 或者wrap_content,按你的需求调整 --> android:layout_height="wrap_content" android:orientation="vertical" android:padding="20sp" tools:context=".ui.popupWindow.PopupWindowFragment">
- 修改PopupWindowFragment代码:新增
onStart方法,配置Window参数调整大小,同时可以根据需求设置占屏幕宽度的比例适配不同设备:
class PopupWindowFragment : DialogFragment() { lateinit var mPopupWindowBinding: FragmentPopupWindowBinding lateinit var mPopupViewModel: PopupViewModel var id: Long = 0L override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { mPopupWindowBinding = DataBindingUtil.inflate( layoutInflater, R.layout.fragment_popup_window, container, false ) return mPopupWindowBinding.root } override fun onStart() { super.onStart() dialog?.window?.let { window -> val params = window.attributes // 调整宽度为屏幕宽度的80%,可以按需求修改比例 val displayMetrics = resources.displayMetrics params.width = (displayMetrics.widthPixels * 0.8).toInt() params.height = WindowManager.LayoutParams.WRAP_CONTENT // 去掉默认Dialog的白底背景,可选 window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) window.attributes = params // 确保点击外部可以关闭,默认是true,如果你之前没改可以不用加这行 dialog?.setCanceledOnTouchOutside(true) } } }
修改完成后重新运行即可,两个问题都会同时解决。
内容的提问来源于stack exchange,提问作者AmirHossein
相关产品推荐
相关产品推荐

