Material dialogs MaterialAlertDialogBuilder 中添加文本编辑框

更新日期: 2022-12-03 阅读次数: 1867 字数: 386 分类: Android

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 聊聊, 查看更多联系方式