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。
界面效果
报错崩溃: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 聊聊, 查看更多联系方式