Kotlin中EditText.text.toString()返回空值问题求助
问题分析与解决:EditText获取文本为空的原因
嘿,这绝对不是Kotlin的bug哦,我来帮你把问题拆解清楚~
核心原因:时机不对!
你现在的代码里,userInput和inputTestText是在setupUI()函数初始化阶段就获取的——这时候用户还没来得及输入任何内容,甚至按钮都还没被点击,所以它们拿到的是EditText初始的空文本快照。
而EditText的text属性返回的是Editable类型,这是个动态可变的对象:当用户输入内容后,这个对象里的内容会实时更新,但你提前赋值的userInput是当时空字符串的副本,不会跟着后续输入自动变化。
那为什么"${edittext_password.text}"能拿到正确值呢?因为字符串模板会在按钮点击事件触发的那一刻才去读取edittext_password.text的当前内容,这时候已经是用户输入后的最新值了。日志里的B行直接调用edittext_username.text也是同样的道理——在点击时才读取最新状态,所以能显示正确的test。
正确的解决方案
把获取EditText文本的逻辑移到按钮的点击回调内部,这样每次用户点击按钮时,都会实时获取当前的输入内容:
private fun setupUI() { findViewById<Button>(R.id.button_login).setOnClickListener { // 在这里才获取最新的输入内容 val userInput: String = edittext_username.text.toString() val passInput: String = edittext_password.text.toString() Log.i(TAG, "inputTestText is null? ${edittext_username.text == null}") Log.i(TAG, "A user: $userInput password: $passInput") Log.i(TAG, "B user: ${edittext_username.text} password: ${edittext_password.text}") } }
补充小说明
你之前的inputTestText是提前获取的Editable对象,它本身不会是null,但如果在点击事件里打印inputTestText.toString(),其实也能看到最新的输入内容——不过还是推荐在需要使用的时候再去获取EditText的文本,这样代码逻辑更清晰,也不会出现这种“看起来有值但实际是空”的混淆情况。
内容的提问来源于stack exchange,提问作者Rhusfer
相关产品推荐
相关产品推荐

