注意本文章不适合给未使用过DataBinding的人阅读
一开始用databing大家可能都是怎么方便怎么来,但是学到后面就要开始合理使用了,使用MVVM架构时要遵循MVVM架构。
下面用一个简单的例子来说明常见的错误。
这个例子就是点击按钮后,Model中的likes就+1,然后刷新视图
先建一个Model如下
data class ObservableFieldProfile(
val name: String,
val lastName: String,
val likes: ObservableInt)
在xml中
<data>
<variable
name="user"
type="com.example.viewModel.data.ObservableFieldProfile" />
</data>
在Activity或Fragment中实例化
private val observableFieldProfile =
ObservableFieldProfile("Ada", "Lovelace", ObservableInt(0))
绑定至xml文件,此处为Activity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val b = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
binding.user = observableFieldProfile
}
xml中button的点击事件实现方法
fun onLike(view: View) {
observableFieldProfile.likes.set(observableFieldProfile.likes.get() + 1)
}
点击按钮之后页面也正常刷新,这种用法的错误就在于把View层和Model层直接关联起来,在MVVM中View层是和ViewModel层关联的而不是Model,所以这种做法是不推荐的。
正确用法如下:
首先建一个ViewModel
/**
* Created by Android Studio.
* User: HuangWeiQiang
* Date: 2021/3/5
* Time: 21:38
*/
class ViewModel : ViewModel() {
private val _name = MutableLiveData("N")
private val _likes = MutableLiveData(0)
//规范的写法
val name: LiveData<String>
get() = _name
val likes: LiveData<Int>
get() = _likes
fun add() {
_likes.value = (_likes.value ?: 0) + 1
}
}
在xml中修改为
<data>
<variable
name="data"
type="com.example.viewModel.ViewModel" />
</data>
Button点击方法为
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{()->data.add()}"
android:text="@{data.name+data.likes}" />
在Activity或Fragment中实例化并绑定至xml,此处为Activity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
b.lifecycleOwner = this
//设置LifecycleOwner应该用于此绑定观察LiveData的变化。 如果LiveData在绑定表达式之一中,
//并且未设置LifecycleOwner,则将不会观察到LiveData,并且不会将其更新传播到UI
val viewModel = ViewModelProvider(this).get(ViewModel::class.java)
b.data = viewModel
}
点击按钮之后页面正常刷新,这是第一种规范的写法,虽然麻烦了些,如果不想用LiveData刷新动态更新,下面有第二种方法,使用Observable Fields。
创建一个ViewModel
class ViewModel2 : ViewModel() {
val name = ObservableField("N")
val likes = ObservableInt(0)
fun add() {
likes.increment()
}
//拓展函数
private fun ObservableInt.increment() {
set(get() + 1)
}
}
在xml中改为
<data>
<variable
name="data"
type="com.example.viewModel.ViewModel2" />
</data>
在Activity或Fragment代码为,此处为Activity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val b = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
// b.lifecycleOwner = this
val viewModel = ViewModelProvider(this).get(ViewModel2::class.java)
b.data = viewModel
}