Android开发中如何获取Dialog内TextInputEditText的输入文本
问题根因
你当前的核心问题是getInput()方法中每次调用都会重新inflate一个全新的布局实例,这个新实例和当前显示在Dialog上的布局完全是两个不同的对象,你从新实例里取到的自然是初始的空字符串。
修复方案
步骤1:缓存Dialog使用的布局视图
修改onCreateDialog()方法,先把inflate出来的布局实例存为类成员变量,后续取输入的时候直接用这个实例查找控件:
// 类内增加成员变量,缓存Dialog绑定的布局视图 private lateinit var dialogView: View override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { val builder = androidx.appcompat.app.AlertDialog.Builder(it) val inflater = requireActivity().layoutInflater // 先inflate布局,存到成员变量里 dialogView = inflater.inflate(R.layout.dialog_add_vpn_tunnel, null) builder.setView(dialogView) .setPositiveButton(R.string.add_vpn_tunnel, DialogInterface.OnClickListener { dialog, id -> addVpn() }) .setNegativeButton(R.string.cancel, DialogInterface.OnClickListener { dialog, id -> getDialog()?.cancel() }) builder.create() } ?: throw IllegalStateException("Activity cannot be null") }
步骤2:修改getInput()方法,从缓存的布局实例中取输入
不要再重新inflate布局,直接用之前存的dialogView查找控件:
private fun getInput(): String { val inputEt = dialogView.findViewById<TextInputEditText>(R.id.input_add_tunnel) return inputEt.text?.toString()?.trim() ?: "" }
可选:修复addVpn()里存储计数的逻辑错误
你当前的计数更新逻辑是无效的,count?.plus(1)不会修改原来的count值,也没有把新的计数存回SharedPreferences,修改如下:
private fun addVpn() { val sp = activity?.getPreferences(AppCompatActivity.MODE_PRIVATE) ?: return // 初始值建议用0,更符合计数逻辑,避免出现tunnel-1这类不符合预期的key val count = sp.getInt("countTunnels", 0) val inputAddTunnel = getInput() if(inputAddTunnel.isNotEmpty()) { sp.edit() .putString("tunnel$count", inputAddTunnel) .putInt("countTunnels", count + 1) // 同步更新计数到SharedPreferences .apply() } }
内容的提问来源于stack exchange,提问作者RummsLetsPlay
相关产品推荐
相关产品推荐

