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

Android Kotlin中HomeFragment与HomeViewModel场景下LiveData正确使用的问题

Android Kotlin中HomeFragment与HomeViewModel场景下LiveData正确使用的问题

嘿,我完全懂你遇到的这个糟心问题——屏幕一转,TextView里显示的EditText内容就没了,这在Android开发里真的是个高频踩坑点!核心原因其实很简单:屏幕旋转属于配置变化,会触发Fragment的销毁重建,要是你没把数据妥善存到ViewModel里,临时数据就会跟着旧Fragment一起被清掉。别慌,咱们一步步来搞定它:

第一步:让HomeViewModel用LiveData托管数据

ViewModel的核心作用就是在配置变化时保存数据,所以咱们得把EditText的输入值放到MutableLiveData里,这样数据就不会随Fragment重建丢失:

class HomeViewModel : ViewModel() {
    // 用MutableLiveData来存储输入文本,初始值设为空字符串就行
    val inputText = MutableLiveData<String>("")
}

第二步:在HomeFragment里正确关联ViewModel并监听数据

接下来要在Fragment里拿到ViewModel的实例,然后把EditText的输入同步到ViewModel,同时观察LiveData来更新TextView:

class HomeFragment : Fragment() {
    private lateinit var viewModel: HomeViewModel

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 关键!通过ViewModelProvider获取ViewModel,这样它会在配置变化时保留
        viewModel = ViewModelProvider(this)[HomeViewModel::class.java]

        val editText = view.findViewById<EditText>(R.id.et_input)
        val textView = view.findViewById<TextView>(R.id.tv_display)

        // 用viewLifecycleOwner观察LiveData,确保视图销毁时自动解绑,避免内存泄漏
        viewModel.inputText.observe(viewLifecycleOwner) { text ->
            textView.text = text
            // 顺便把数据回显到EditText,不然旋转后EditText也会空
            editText.setText(text)
        }

        // 监听EditText的输入变化,实时同步到ViewModel的LiveData里
        editText.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
            override fun afterTextChanged(s: Editable?) {
                viewModel.inputText.value = s.toString()
            }
        })
    }
}

几个必须注意的关键点

  • 一定要用viewLifecycleOwner作为LiveData的观察者,而不是this(Fragment本身),这样能保证Fragment视图销毁时自动取消观察,避免内存泄漏
  • 获取ViewModel必须通过ViewModelProvider(this),不能自己new,否则ViewModel会和Fragment一起销毁,起不到保存数据的作用
  • 别把数据存在Fragment的成员变量里,Fragment重建时这些变量会被重置,白忙活一场

这样改完之后,你再旋转屏幕试试——ViewModel会稳稳地存着输入的文本,Fragment重建后会立刻从LiveData里拿到数据,同步到TextView和EditText,再也不会消失啦!

备注:内容来源于stack exchange,提问作者Timo4ka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:37:39