1、创建 LiveData 对象
LiveData
对象通常存储在 ViewModel
对象中,并可通过 getter 方法进行访问
class OneFragmenModel : ViewModel() {
val name: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
2、观察 LiveData 对象
在大多数情况下,应用组件的 onCreate()
方法是开始观察 LiveData
对象的正确着手点,原因如下:
- 确保系统不会从 Activity 或 Fragment 的
onResume()
方法进行冗余调用。 - 确保 Activity 或 Fragment 变为活跃状态后具有可以立即显示的数据。一旦应用组件处于
STARTED
状态,就会从它正在观察的LiveData
对象接收最新值。只有在设置了要观察的LiveData
对象时,才会发生这种情况。
class OneFragment : Fragment() {
private val oneFragmenModel: OneFragmenModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
oneFragmenModel.name.observe(viewLifecycleOwner, Observer<String> {
textview.text = it
})
button.setOnClickListener {
oneFragmenModel.name.value = "我变化了"
}
}
}
3、配合数据绑定使用LiveData
livedata进行数据绑定时,有一句关键代码要加上,不然框架不会监听变化。
lifecycleOwner = viewLifecycleOwner,意思是数据绑定的生命周期和fragment的生命周期绑定(我猜的 哈哈)。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="onefragmentModel"
type="com.example.myapplication.fragment.viewmodel.OneFragmenModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="改变" />
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{onefragmentModel.name}" />
</LinearLayout>
</layout>
class OneFragment : Fragment() {
var num = 0
private val oneFragmenModel: OneFragmenModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
button.setOnClickListener {
oneFragmenModel.name.value = "dddd" + num
num++
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val fragmentOneBinding = DataBindingUtil.inflate<FragmentOneBinding>(
layoutInflater,
R.layout.fragment_one,
container,
false
).apply {
onefragmentModel = oneFragmenModel
lifecycleOwner = viewLifecycleOwner
}
return fragmentOneBinding.root;
}
}
class OneFragmenModel : ViewModel() {
val name: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
4、扩展 LiveData
如果观察者的生命周期处于 STARTED
或 RESUMED
状态,则 LiveData 会认为该观察者处于活跃状态。
可以继承 LiveData
或者MutableLiveData
,重写onActive()
和onInactive()
,当该对象使用observe()
方法将与 Fragment 视图关联的 LifecycleOwner
作为第一个参数传递。这样做表示此观察者已绑定到与所有者关联的 Lifecycle
对象,这个时候onActive()
会被调用,当Lifecycle
被销毁,这个时候onInactive()
会被调用。
class NameLiveData(value: String) : LiveData<String>(value) {
override fun onActive() {
Log.d("haha", "onActive")
}
override fun onInactive() {
Log.d("haha", "onInactive")
}
}