Jetpack是google現(xiàn)在主推的框架, 從開(kāi)發(fā)效率,代碼健壯程度,對(duì)未來(lái)的兼容性, 相較舊的開(kāi)發(fā)框架都有一定優(yōu)勢(shì). 所以開(kāi)始學(xué)習(xí)吧
簡(jiǎn)介
1.ViewModel
主要優(yōu)勢(shì)之一, 就是在同一個(gè)Activity內(nèi), 跨Fragment共享數(shù)據(jù)非常方便
之二, 就是在系統(tǒng)設(shè)置改變后, Activity丟失狀態(tài)的問(wèn)題可以很好的解決
其他希望大佬可以補(bǔ)充下
2.liveData
既是一個(gè)觀察者(觀察生命周期, 適當(dāng)?shù)臅r(shí)候把自己回收)
也是一個(gè)被觀察者(數(shù)據(jù)變更進(jìn)行通知,但是數(shù)據(jù)通知只發(fā)生在生命周期活躍狀態(tài) STARTED、RESUMED)。
3.dataBinding
數(shù)據(jù)與界面雙向綁定
xml可以直接回調(diào)bean的方法
數(shù)據(jù)變更后, xml會(huì)自動(dòng)更新
用起來(lái)
1.viewBinding
用于替代findViewById() 和 Butterknife
順便 "kotlin-android-extensions" 插件也已經(jīng)過(guò)期了 官方建議替換為viewBinding方式
版本前提:AndroidStudio 3.6+ Gradle plugin 3.6+ kotlin 1.4+
plugins{
//如果要用到@Parcelize
id 'kotlin-parcelize'
}
android{
//Android studio and Gradle 3.6+
viewBinding {
enabled = true
}
//Android studio and Gradle 4.0+
buildFeatures {
viewBinding true
}
}
代碼中綁定
//例如 對(duì)應(yīng)的xml文件為 aaa_bbb.xml 其中有 btn_id1 的按鈕
//會(huì)自動(dòng)生成 AaaBbbBinding類
//setContentView(R.layout.aaa_bbb.xml) 替換為如下
var binding = DataBindingUtil.setContentView<AaaBbbBinding>(this, R.layout.aaa_bbb)
var btn_id1:Button = binding.btn_id1
至此, xml中的任何view都可以通過(guò) binding.xxx 取到 (xxx對(duì)應(yīng) view的id)
2.ViewModel+LiveData+DataBinding
build.gradle
android{
//Android studio and Gradle 3.6+
viewBinding {
enabled = true
}
dataBinding {
enabled true
}
//Android studio and Gradle 4.0+
buildFeatures {
dataBinding true
viewBinding true
}
}
dependencies{
def lifecycle_version = "2.3.1"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}
定義ViewModel
class ExampleA:ViewModel(){
var value:MutableLiveData<Int> = MutableLiveData(0)
fun setVal(index:Int){
this.value.value = index
}
fun add(){
setVal(this.value.value!! + 1)
}
}
在xml中指定ViewModel
指定ViewModel類型 為 ExampleA ,別名為 exampleVm
使用 '@{exampleVm.value}' 取值, 如果有其他字符串混合 , 其他字符串用雙引號(hào)""+
也可以使用@{exampleVm::add} 調(diào)用方法, 注意這里簽名需要保持一致
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="exampleVm"
type="com.xx.xxx.bean.viewmodel.ExampleA" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_id1"
android:layout_width="200dp"
android:onClick="@{(v)-> exampleVm.add()}"
android:layout_height="wrap_content"
android:text='@{"當(dāng)前value "+exampleVm.value}'
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
在activity/fragment中 綁定view model
var binding = DataBindingUtil.setContentView<AaaBbbBinding>(this, R.layout.aaa_bbb)
binding.exampleVm = ViewModelProvider(this).get(ExampleA::class.java)
//必須關(guān)聯(lián)生命周期 否則刷新無(wú)效
binding.lifecycleOwner = this
以上就完成了這三個(gè)庫(kù)的簡(jiǎn)單配合使用, 如有錯(cuò)誤, 請(qǐng)勞煩指正