Kotlin安卓Fragment弹出自定义AlertDialog报IllegalStateException错误求助
错误触发原因
核心问题出在自定义Dialog类PublishDiolog的onCreateDialog方法中:
你在构建AlertDialog时连续执行了两次setView操作:
- 第一次调用
builder.setView(view),将从dialog_publish.xml中inflate出来的完整布局设置给弹窗,此时布局里的input(描述输入框)已经属于这个inflate出来的View的子控件,已经绑定了父布局 - 后面又额外调用了一次
builder.setView(input),尝试把已经有父布局的输入框控件单独设置给弹窗,系统检测到该View已经有父容器,直接抛出了对应异常
另外你在Fragment中写的各种removeAllViews操作完全属于多余操作,不仅不能解决问题,还会误删Fragment本身的页面布局。
可行解决方案
步骤1:修改自定义Dialog的onCreateDialog方法
删除多余的第二次setView(input)调用,修改后的代码如下:
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { val builder = AlertDialog.Builder(it) title?.let { title -> builder.setTitle(title) } val inflater = requireActivity().layoutInflater val view: View = inflater.inflate(R.layout.dialog_publish, null, false) // 只保留这一次setView,设置完整自定义布局 builder.setView(view) initView(view) input.setHint("Descripción") input.inputType = InputType.TYPE_CLASS_TEXT input_price.setHint("€") input_price.inputType = InputType.TYPE_CLASS_NUMBER builder .setMessage(description) .setPositiveButton("Yes", DialogInterface.OnClickListener { _, _ -> var d_Text = input.text.toString() savedInstanceState?.putString("user_des", d_Text) listener.onDialogPositiveClick(this) }) .setNegativeButton("No", DialogInterface.OnClickListener { _, _ -> listener.onDialogNegativeClick(this) }) // 删掉这里的.setView(input)代码 builder.create() } ?: throw IllegalStateException("Activity cannot be null") }
步骤2:删除Fragment中所有多余的移除View代码
删掉以下三处代码:
invoke方法中的:
val parent = this.parentFragment?.requireView() as ViewGroup parent.removeAllViews()
showdialog方法中的:
if(confirmationDialogFragment.parentFragment != null){ (confirmationDialogFragment.parentFragment as ViewGroup).removeAllViews() }
onDestroyView方法中的:
if (view != null) { val parent = view!!.parent as ViewGroup parent.removeAllViews() }
步骤3:可选优化(避免潜在空指针)
你在newInstance方法中给Bundle存PRICE的时候,用的是当前类还未初始化的price属性,会存null值,如果你不需要用到这个参数可以直接删掉相关代码,如果需要用可以改成传入参数的形式赋值。
修改后重新运行即可解决弹窗报错问题。
内容的提问来源于stack exchange,提问作者Manuel Lucas
相关产品推荐
相关产品推荐

