Kotlin中无法从自定义Dialog获取输入文本的技术问题
解决方案
核心错误原因
XML布局中输入框的id是username(全小写),但代码中一直使用userName(驼峰命名),大小写不匹配导致无法找到对应控件,这是两种方式都失败的根本原因。
具体修复方法
方法1:修正findViewById的id匹配
将代码中的R.id.userName改为R.id.username,同时控件类型建议改为EditText(更准确,虽然EditText继承自TextView):
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { val builder = AlertDialog.Builder(it) val inflater = requireActivity().layoutInflater val inflatedView = inflater.inflate(R.layout.dialog_create_task_type, null) // 修正id为username,类型改为EditText val userNameInput = inflatedView.findViewById<EditText>(R.id.username) builder.setView(inflatedView) .setPositiveButton("ok") { dialog, id -> // 获取输入框文本并回调 listener.onDialogPositiveClick(this, userNameInput.text.toString()) dialog.cancel() } .setNegativeButton("cancel") { dialog, id -> dialog.cancel() } builder.create() } ?: throw IllegalStateException("Activity cannot be null") }
方法2:正确使用View Binding
- 确保已在模块的
build.gradle中启用View Binding:
android { ... buildFeatures { viewBinding true } }
- 修正Binding类引用和控件id:
布局文件名是dialog_create_task_type.xml,对应的Binding类是DialogCreateTaskTypeBinding(不是TaskTypeLayoutBinding),控件id为username,所以用binding.username:
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { val builder = AlertDialog.Builder(it) // 直接用Binding类inflate布局,无需手动调用inflater val binding = DialogCreateTaskTypeBinding.inflate(requireActivity().layoutInflater) builder.setView(binding.root) .setPositiveButton("ok") { dialog, id -> // 获取输入框文本并回调 listener.onDialogPositiveClick(this, binding.username.text.toString()) dialog.cancel() } .setNegativeButton("cancel") { dialog, id -> dialog.cancel() } builder.create() } ?: throw IllegalStateException("Activity cannot be null") }
内容的提问来源于stack exchange,提问作者sara fernandes
相关产品推荐
相关产品推荐

