Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过数据绑定使用LiveData_Android_Kotlin_Android Databinding_Android Architecture Components_Android Mvvm - Fatal编程技术网

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&lt;String&gt;"/>
    </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
    }
}