跳转至

安卓系统中视图模型的数据绑定

原文:https://www . geesforgeks . org/data-binding-with-view model-in-Android/

先决条件:

在 ViewModel 中集成数据绑定有什么好处?简单地说,它提供了视图与其数据(或者可以说是视图的数据)之间的便捷通信。正如我们所知,视图是在 XML 文件中定义的,XML 文件与它们的活动或片段文件相链接,但是它们的数据存储在视图模型对象中。因此,如果数据想要与视图通信,活动或片段文件将充当中介。这也将提高开发者的生产力,因为它减少了样板代码。因此,在本文中,我们将讨论如何直接连接视图和视图模型对象中的数据。

实施

我们将通过使用 Kotlin 创建一个简单的应用程序来了解这一点。

创建活动为空的应用程序。当我们使用数据绑定时,我们需要在 build.gradle 文件中启用数据绑定

创建视图模型类

我的锅

class MainViewModel : ViewModel() {
    var text = " Welcome to my application "

    fun updateText() {
        text = " Text is Updated "
    }
}

现在我们需要在 XML 中创建一个布局,并在 XML 布局中创建一个变量。使用数据标签我们声明一个变量。

可扩展标记语言

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="mainViewModel"
            type="com.ayush.databinding.MainViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="50dp"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:gravity="center_horizontal"
            android:text="@{ mainViewModel.text }"
            android:textSize="24sp" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Update text"
            android:onClick="@{ ()-> mainViewModel.updateText() }"/>

    </LinearLayout>

</layout>

现在,我们需要在 Activity 中创建一个绑定对象,将数据传递给我们在 XML 布局和 MainViewModel 对象中定义的变量,作为视图的数据源。

我的锅

class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding
    lateinit var mainViewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        mainViewModel = MainViewModel()

        binding.mainViewModel = mainViewModel
    }
}

输出:

我们的应用程序已经准备好了,它也在工作,因为我们可以看到存储在视图模型对象中的文本形式的数据。因此,我们知道了如何直接将视图与其数据进行通信,而无需借助任何中介。但是,在这个应用程序中,有一个问题,如果我们单击“更新文本”按钮,文本不会像预期的那样更新,但它将保持不变。这是因为对于任何新的数据更改,我们需要再次将更改文本(数据)设置为视图,因此我们需要在活动文件中定义一个函数来更新视图。但是我们不想让视图与活动交流。

所以这里我们可以使用实况数据,简单的说,实况数据就是观测者数据持有者类。如果我们将任何数据声明为 LiveData ,那么这些数据就可以被像 Activity、Fragments 等安卓组件观察到。因此,如果我们将任何数据声明为实时数据,并使用视图绑定将其绑定到视图,那么每当数据更改时,视图都会自动更新。在本文中,我们只讨论了使用视图模型的数据绑定,在下一篇文章中,我们还将看到使用 LiveData 的数据绑定。


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组