自定义Dialog中EditText返回null?技术问题求助
解决AlertDialog中
dialogEditText must not be null的异常问题 我来帮你拆解下这个问题的根源,以及对应的修复方案。
先看你代码里的核心问题:你用了kotlinx.android.synthetic.main.dialog.*来直接引用dialogEditText,但这个合成属性的工作逻辑是绑定到当前Activity的视图层级的——而你对话框的布局是通过LayoutInflater动态inflate出来的独立视图,并没有被添加到MainActivity的视图树里,所以Activity根本找不到这个EditText,自然就抛出IllegalStateException了。
下面给你两种可行的修复方案:
方案1:直接获取inflate视图的引用
在inflate对话框布局后,手动通过视图对象找到EditText,确保引用是有效的:
fab.setOnClickListener { view -> // 先inflate出对话框的视图 val dialogView = LayoutInflater.from(this@MainActivity).inflate(R.layout.dialog, null) // 从这个视图里获取EditText的引用 val dialogEditText = dialogView.findViewById<EditText>(R.id.dialogEditText) AlertDialog.Builder(this@MainActivity) .setView(dialogView) .setPositiveButton("OK") { dialog, i -> Toast.makeText( this@MainActivity, dialogEditText.text, Toast.LENGTH_SHORT ).show() dialog.dismiss() }.show() }
方案2:使用ViewBinding(推荐)
ViewBinding是官方推荐的视图绑定方式,比合成属性更安全,能彻底避免null异常:
- 首先在你的模块级
build.gradle(或build.gradle.kts)里启用ViewBinding:
android { ... buildFeatures { viewBinding true } }
- 然后修改MainActivity里的代码:
// 注意这里不需要再导入kotlinx.android.synthetic.main.dialog.*了 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) fab.setOnClickListener { view -> // 用ViewBinding来inflate对话框布局 val binding = DialogBinding.inflate(LayoutInflater.from(this@MainActivity)) AlertDialog.Builder(this@MainActivity) .setView(binding.root) .setPositiveButton("OK") { dialog, i -> Toast.makeText( this@MainActivity, binding.dialogEditText.text, Toast.LENGTH_SHORT ).show() dialog.dismiss() }.show() } } }
这样无论什么时候,你都能通过binding.dialogEditText安全地访问到对话框里的EditText,再也不会出现null异常了。
内容的提问来源于stack exchange,提问作者matolaypal
相关产品推荐
相关产品推荐

