1、創(chuàng)建 LiveData 對象
LiveData
對象通常存儲在 ViewModel
對象中隧出,并可通過 getter 方法進(jìn)行訪問
class OneFragmenModel : ViewModel() {
val name: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
2颊亮、觀察 LiveData 對象
在大多數(shù)情況下,應(yīng)用組件的 onCreate()
方法是開始觀察 LiveData
對象的正確著手點(diǎn)拂铡,原因如下:
- 確保系統(tǒng)不會(huì)從 Activity 或 Fragment 的
onResume()
方法進(jìn)行冗余調(diào)用壹无。 - 確保 Activity 或 Fragment 變?yōu)榛钴S狀態(tài)后具有可以立即顯示的數(shù)據(jù)葱绒。一旦應(yīng)用組件處于
STARTED
狀態(tài),就會(huì)從它正在觀察的LiveData
對象接收最新值斗锭。只有在設(shè)置了要觀察的LiveData
對象時(shí)地淀,才會(huì)發(fā)生這種情況。
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岖是、配合數(shù)據(jù)綁定使用LiveData
livedata進(jìn)行數(shù)據(jù)綁定時(shí)骚秦,有一句關(guān)鍵代碼要加上,不然框架不會(huì)監(jiān)聽變化璧微。
lifecycleOwner = viewLifecycleOwner作箍,意思是數(shù)據(jù)綁定的生命周期和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前硫、擴(kuò)展 LiveData
如果觀察者的生命周期處于 STARTED
或 RESUMED
狀態(tài)胞得,則 LiveData 會(huì)認(rèn)為該觀察者處于活躍狀態(tài)。
可以繼承 LiveData
或者MutableLiveData
屹电,重寫onActive()
和onInactive()
阶剑,當(dāng)該對象使用observe()
方法將與 Fragment 視圖關(guān)聯(lián)的 LifecycleOwner
作為第一個(gè)參數(shù)傳遞。這樣做表示此觀察者已綁定到與所有者關(guān)聯(lián)的 Lifecycle
對象,這個(gè)時(shí)候onActive()
會(huì)被調(diào)用危号,當(dāng)Lifecycle
被銷毀牧愁,這個(gè)時(shí)候onInactive()
會(huì)被調(diào)用。
class NameLiveData(value: String) : LiveData<String>(value) {
override fun onActive() {
Log.d("haha", "onActive")
}
override fun onInactive() {
Log.d("haha", "onInactive")
}
}