簡介
View:主要進行視圖控件的一些初始設置,不應該有任何的數據邏輯操作。
Model:定義實體類,以及獲取業務數據模型,比如通過數據庫或者網絡來操作數據等。
ViewModel:作爲連接 View 與 Model 的中間橋樑,ViewModel 與 Model 直接交互,處理完業務邏輯後,通過 DataBinding 將數據變化反應到用戶界面上。
配置
在 Module:app 的 build.gradle 文件添加如下代碼:
android {
// ...
dataBinding {
enabled = true
}
}
佈局
DataBinding 佈局文件的根標籤是 layout 標籤,layout 裏面有一個 data 元素和 View 元素,data 元素裏面的 main 就是我們自定義的 main 實體類
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<data >
<variable
name="main"
type="com.epuxun.drink.bean.MainBean" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{main.msg}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@{main.buttonText}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_msg" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
MainBean實體類代碼如下:
class MainBean{
var msg = ObservableField<String>()
var buttonText = ObservableField<String>()
init {
msg.set("dataBing")
buttonText.set("點擊測試")
}
}
這個實體類的元素是 DataBinding 中的 ObservableField 類,ObservableField 的作用是,當我們實體類中的值發生改變時,會自動通知View刷新。所以使用 DataBinding 的時候,建議使用 ObservableField 來定義實體類。
綁定 layout
val activityMainBinding = DataBindingUtil.setContentView<ActivityMvvmBinding>
(this, R.layout.activity_mvvm)
val main = MainBean()
activityMainBinding.main = main
類名activityMainBinding生成規則:佈局文件名+Binding
當然也可以自定義類名,自定義類名需要在佈局文件添加如下代碼
<data class="MainActivityBinding">
綁定代碼更改爲
val mainActivityBinding = DataBindingUtil.setContentView<MainActivityBinding>
(this, R.layout.activity_mvvm)
val main = MainBean()
mainActivityBinding.main = main
測試改變MainBean數據UI同時改變
button.setOnClickListener {
main.msg.set("${i++}")
}
自定義基類
abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity() {
abstract fun getLayoutId(): Int
abstract fun initView(activityBinding: T)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val activityBinding = DataBindingUtil.setContentView<T>(this, getLayoutId())
initView(activityBinding)
}
}
使用
class MainActivity : BaseActivity<MainActivityBinding>() {
private var i = 0
override fun getLayoutId(): Int {
return R.layout.activity_mvvm
}
override fun initView(activityBinding: MainActivityBinding) {
val main = MainBean()
activityBinding.main = main
button.setOnClickListener {
main.msg.set("${i++}")
}
}
}