简介
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++}")
}
}
}