You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ObservableField取值为空?Android数据绑定问题求助

问题原因及修复方案

你的代码存在两个关键问题,导致无法获取EditText的输入值:

  • 重复调用setContentView破坏绑定:使用DataBindingUtil.setContentView已经完成了布局加载和绑定初始化,但后续调用setContentView(binding.root)会重新加载布局,直接覆盖之前的数据绑定关系,使得EditText的内容无法同步到editTextValue。

  • 未绑定布局变量实例:布局中定义了activity变量,但你没有将当前Activity实例赋值给binding.activity,导致双向绑定表达式@={activity.editTextValue}无法关联到你声明的editTextValue字段。

修复后的MainActivity代码

class MainActivity : AppCompatActivity() {
    var editTextValue = ObservableField<String>("")

    private lateinit var binding: ActivityMainBinding

    private lateinit var chatViewModel: ChatViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 仅用DataBindingUtil完成布局加载,不需要再调用setContentView
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        // 将当前Activity实例赋值给布局中的activity变量
        binding.activity = this
        
        binding.sendButton.setOnClickListener {
            val inputValue = editTextValue.get().orEmpty()
            println("$inputValue ABC")

            if(inputValue.isEmpty()){
                println("WHY IS EMPTY")
                return@setOnClickListener
            }
            // 这里可以继续处理非空的输入值
        }
    }
}

补充说明

  1. 移除重复的setContentView(binding.root),保留DataBindingUtil.setContentView的调用即可完成布局与绑定的初始化。
  2. 通过binding.activity = this建立布局变量与Activity实例的关联,双向绑定才能正常工作,EditText的输入会自动同步到editTextValue中。
  3. 使用orEmpty()替代!!可以避免空指针异常,让代码更安全。

内容的提问来源于stack exchange,提问作者Ashish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:30:55