MVVM之DataBinding模式的基本使用

简介

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

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章