DialogFragment中访问AlertDialog的android.R.id.custom报错如何解决?
报错原因
你调用requireView()获取的是DialogFragment本身的根视图,只有当你重写onCreateView()方法并返回自定义布局时,这个视图才会被创建。你当前的实现是重写onCreateDialog()直接返回AlertDialog实例,没有走onCreateView()的视图创建流程,所以任何时候调用requireView()都会抛出IllegalStateException。
正确访问
android.R.id.custom的方式 android.R.id.custom是AlertDialog内置布局中的容器控件,需要从AlertDialog实例本身查找,且要等AlertDialog完成布局渲染后再调用查找逻辑,正确实现如下:
class CustomDialogFragment3(context: Context) : DialogFragment() { private val builder: MaterialAlertDialogBuilder = MaterialAlertDialogBuilder(context) override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { builder.setTitle("Custom Dialog") builder.setMessage("content") builder.setPositiveButton("OK") { _, _ -> // 点击事件中也可直接通过dialog实例访问custom容器 } // 先创建AlertDialog实例 val alertDialog = builder.create() // 监听show回调,此时AlertDialog布局已完成渲染 alertDialog.setOnShowListener { val customContainer: FrameLayout? = alertDialog.findViewById(android.R.id.custom) customContainer?.let { fl -> val myView = LayoutInflater.from(requireContext()).inflate(R.layout.layout_image, fl, false) fl.addView(myView, ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) } } return alertDialog } }
注意事项
- 查找控件的主体是
AlertDialog实例,不能通过DialogFragment的视图查找 - 必须在
OnShowListener回调中执行查找逻辑:AlertDialog在create阶段仅完成参数配置,布局会延迟到show阶段才完成Inflate,提前查找会返回null
内容的提问来源于stack exchange,提问作者BabyishTank
相关产品推荐
相关产品推荐

