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
相关产品推荐
相关产品推荐

