Android 通过数据绑定使用LiveData
随着安卓体系结构组件的稳定,我开始将所有基本的Android 通过数据绑定使用LiveData,android,kotlin,android-databinding,android-architecture-components,android-mvvm,Android,Kotlin,Android Databinding,Android Architecture Components,Android Mvvm,随着安卓体系结构组件的稳定,我开始将所有基本的ViewModels更新为新的实现。根据我的理解,建议使用来保存Model类,因为它可以更好地处理生命周期 我喜欢使用数据绑定,因为它使Java/Kotlin端的代码更清晰,并且不需要“观察”值的变化来更新UI。但是,如果模型(或视图模型)扩展而LiveData未扩展,则使用数据绑定的布局仅监视数据更改。我知道LiveData的主要目标之一是通过编程观察和更新UI,但对于简单的更新,数据绑定非常有用 这个问题已经被报道过了,第一个版本是1.0版,现在
ViewModel
s更新为新的实现。根据我的理解,建议使用来保存Model
类,因为它可以更好地处理生命周期
我喜欢使用数据绑定
,因为它使Java/Kotlin端的代码更清晰,并且不需要“观察”值的变化来更新UI。但是,如果模型
(或视图模型)扩展而LiveData
未扩展,则使用数据绑定的布局仅监视数据更改。我知道LiveData
的主要目标之一是通过编程观察和更新UI,但对于简单的更新,数据绑定
非常有用
这个问题已经被报道过了,第一个版本是1.0版,现在这个功能正在开发中
为了使用LiveData
和数据绑定
,我创建了一个非常简单的类实现,扩展了BaseObservable
:
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.databinding.BaseObservable
class ObservableMutableLiveData<T>() : BaseObservable() {
private var data: MutableLiveData<T> = MutableLiveData()
constructor(data: T) : this() {
this.data.value = data
}
public fun set(value: T) {
if (value != data.value) {
data.value = value
notifyChange()
}
}
public fun get(): T? {
return data.value
}
public fun getObservable(): LiveData<T> {
return data
}
}
导入android.arch.lifecycle.LiveData
导入android.arch.lifecycle.MutableLiveData
导入android.databinding.BaseObservable
类observableMatableLiveData():BaseObservable(){
私有变量数据:MutableLiveData=MutableLiveData()
构造函数(数据:T):this(){
this.data.value=数据
}
公共娱乐集(值:T){
如果(值!=data.value){
data.value=value
notifyChange()
}
}
公共娱乐获取():T{
返回数据.value
}
public fun getObservable():LiveData{
返回数据
}
}
因此,基本上我的observableMulableLiveData
是使用LiveData
存储模型的副本,通过此实现,布局在每次模型更新后都会更新
问题是:
- 这是
LiveData
的糟糕实现吗?此包装器是否“破坏”了LiveData
的功能,例如生命周期感知
- 据我所知,
LiveData
是新的observefield
。这是正确的吗
Android Studio 3.1(目前在金丝雀6中)将解决此问题,因为LiveData
可以用作可观察字段
:
数据绑定更新:
现在,您可以将LiveData对象用作数据绑定表达式中的可观察字段。ViewDataBinding类现在包括一个新的setLifecycle方法,您需要使用它来观察LiveData对象
资料来源:对于那些遇到这个问题,想找一个像我这样的例子的人,这里有一个:
在布局.xml
中,将LiveData
元素与其类型放在一起:
<layout>
<data>
<variable
name="myString"
type="android.arch.lifecycle.MutableLiveData<String>"/>
</data>
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{myString}'
...
/>
...
</layout>
...
...
在代码集中,它的值和生命周期所有者:
MutableLiveData<String> myString = new MutableLiveData<>();
...
binding.setLifecycleOwner(this);
binding.setMyString(myString);
MutableLiveData myString=new MutableLiveData();
...
binding.setLifecycleOwner(此);
binding.setMyString(myString);
就这样:)
请注意,LiveData
元素的默认值为null
,因此请指定初始值以确保立即获得所需效果,或使用以强制实现可空性
编辑:
使用androidx.lifecycle.MutableLiveDataString
作为类型,如果对androidx使用androidx
将是:
androidx.lifecycle.MutableLiveData
...
...
对于科特林:
val myStr = MutableLiveData<String>()
...
binding.apply {
setLifecycleOwner(this)
this.myString = myStr
}
val myStr=MutableLiveData()
...
应用{
setLifecycleOwner(此)
this.myString=myStr
}
祝你好运!:) 被接受的答案没有给出一个例子。这是我测试过的一个,它很有效
在布局中:
<layout>
<data>
<variable
name="viewmodel"
type="com.abc.xyz.viewmodels.MyViewModel"/>
</data>
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{viewmodel.myString}'
...
/>
...
</layout>
你能提供一个如何做到这一点的例子吗?@kyurkchyan添加这个binding.setLifecycleOwner(这个)代码>将数据绑定用于实时数据的正确方法现在位于数据绑定的文档中:。
<layout>
<data>
<variable
name="viewmodel"
type="com.abc.xyz.viewmodels.MyViewModel"/>
</data>
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{viewmodel.myString}'
...
/>
...
</layout>
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?, savedInstanceState: Bundle?): View? {
val binding: FragmentAlbumBinding = DataBindingUtil.inflate(
inflater, R.layout.fragment_album, container, false)
binding.apply {
fragment = this
viewModel = albumViewModel
lifecycleOwner = this
}
}