Material dialogs MaterialAlertDialogBuilder 中添加文本编辑框

文章目录

    setView

    官方 Material Design 3 的文档中并没有详细的 MaterialAlertDialogBuilder 使用说明。

    https://github.com/material-components/material-components-android/blob/master/docs/components/Dialog.md

    找不到如何在里面添加文本编辑框。

    但是在接口文档中可以看到有一个 setView 的方法

    https://developer.android.com/reference/com/google/android/material/dialog/MaterialAlertDialogBuilder#setView(int)

    虽然没有一个字的说明,但是可以猜测应该是可以关联一个布局文件。

    这个时候 GitHub 就是最好的参考资料,果然找到一堆示例代码:

    Kotlin 代码参考

    https://github.com/murodjon-sattorov/Firebase-chat-app/blob/master/app/src/main/java/uz/murodjon_sattorov/firebasechatapp/dialogs/ChangeDataDialog.kt

    import some.databinding.ChangeDataDialogBinding
    
    class ChangeDataDialog(var context: Context) {
        private var changeDataDialogBinding: ChangeDataDialogBinding =
            ChangeDataDialogBinding.inflate(LayoutInflater.from(context))
        private lateinit var materialAlertDialogBuilder: MaterialAlertDialogBuilder
        private lateinit var dialog: Dialog
    
        fun changeName(name: String) {
            materialAlertDialogBuilder = MaterialAlertDialogBuilder(context)
            materialAlertDialogBuilder.setView(changeDataDialogBinding.root)
    
            changeDataDialogBinding.enterText.setText(name)
            changeDataDialogBinding.saveData.setOnClickListener {
                reference.child("userFullName").setValue(changeDataDialogBinding.enterText.text.toString()).addOnCompleteListener {
                    dialog.dismiss()
                    Toast.makeText(context, "Save data", Toast.LENGTH_SHORT).show()
                }
            }
            dialog = materialAlertDialogBuilder.show()
        }
    }
    

    对应的,存在一个 layout 文件 layout/change_data_dialog.xml。
    即 MaterialAlertDialogBuilder 内用来展示 EditView 的布局文件。

    由于使用了 View Binding,所以自动生成了类 ChangeDataDialogBinding。
    只需要将其实例化,并作为参数传给 MaterialAlertDialogBuilder.setView。

    界面效果

    MaterialAlertDialogBuilder

    报错崩溃:The specified child already has a parent

    但是,我参照这个示例写了一段 RecyclerView ViewHolder 中点击按钮弹出对话框的代码,在第二次点击按钮时,百分百报错崩溃。

    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child’s parent first.

    异常出现在 dialog show 上。

    查了一下,原来 show 调用时,会先 create, 然后将 setView 中的 view 添加到 dialog 中。于是点击第二次,就造成了这个错误。

    解决方法:

    在点击事件外,创建 dialog = MaterialAlertDialogBuilder….create(),点击事件内部只调用 dialog.show().

    参考:
    https://stackoverflow.com/questions/34831521/alertdialog-the-specified-child-already-has-a-parent

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式