Android DataBinding的基本使用

2023-03-13 08:35:16

DataBinding 是谷歌官方发布的一个框架,顾名思义即为数据绑定,是 MVVM 模式在 Android 上的一种实现,用于降低布局和逻辑的耦合性,使代码逻辑更加清晰。MVVM 相对于 MVP,其实就是将 Presenter 层替换成了 ViewModel 层。DataBinding 能够省去我们一直以来的 findViewById() 步骤,大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常

虽然dataBinding使用起来可能会有一些坑,比如找不到文件之类的,但是既然是google发布的。我们应当看看。

1、开启配置
如果想使用dataBinding,首先,在 build.gradle 文件中开启databinding的使用:

android{
    ...
   
      dataBinding {
        enabled = true;
    }
}

2、使用方法
2.1 单项绑定
其次就是在xml布局文件中把根布局设为,且规则如下:

使用 DataBinding 必须要使用 这个标签作为 xml 的根部局
所有 DataBinding 的内容都写在 标签内
是导入所使用的对象的类型
是具体声明一个数据对象, 是这个对象的名字, 是这个对象的类型, 可以有多个
使用 @{ } / @{book.price} 的方式可以把这个声明出来的数据对象的莫个数据设置给我们的 view
具体使用如下:

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

    <data>

        <variable
            name="bindingEntity"
            type="com.example.databinding.model.BindingEntity" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.databinding.TestActivity">

        <TextView
            android:id="@+id/tv_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{bindingEntity.name}"
            android:textSize="20sp"
            tools:text="zhangsan" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

< variable>标签下的name为自定义model的名称,type为model的具体路径。
还有一种使用 < import> 标签的定义方法如下:

<data>
        <import type="com.example.databinding.model.BindingEntity"/>
        <variable name="bindingEntity" type="BindingEntity"></variable>
</data>

此处格式设置完毕后。即可在xml中以@{xxx.xxx}来绑定data,如下:

     

   <TextView
            android:id="@+id/tv_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{bindingEntity.name}"
            android:textSize="20sp"
            tools:text="test" />

到此。并不算结束。还需要在activity中DataBindingUtil.setContentView来绑定。
如下:

class TestActivity : AppCompatActivity() {
    lateinit var binding: ActivityTestBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_test)

        val entity = BindingEntity()
        entity.name = "张三"
        entity.age = "20"
        binding.bindingEntity = entity
        
        //用binding获取View,在java中可以不用注解,依然省略findViewById
        binding.tvTest.setOnClickListener{
           Toast.makeText(this,"test",Toast.LENGTH_SHORT).show()
        }
    }
}


2.2 双向绑定
DataBinding的本身是对View层状态的一种观察者模式的实现,通过让View与ViewModel层可观察的对象(比如LiveData)进行绑定,当ViewModel层数据发生变化,View层也会自动进行UI的更新。

前面是DataBinding最基础的用法,即 单向绑定 ,其优势在于,将View层抽象为一个纯Java的可观察者——这意味着ViewModel层相关代码是完全可直接用于进行 单元测试。

但实际的开发中,单向绑定并非是足够的,在一些特定的场景,我们也需要用到 双向绑定。

xml用法
只需要在xml赋值时改为 @={xxx.xxx} 即可,代码如下:

android:text="@={bindingEntity.name}"



Observable Binding 用法

这个方法需要改在model,依然非常简单,需要让model继承BaseObservable,且在get方法中实现 @Bindable 和set方法中使用notifyPropertyChanged 方法,如下:

public class BindingEntity extends BaseObservable{
    private String name;
    
    @Bindable
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }
}

注意: BR是编译阶段生成的一个类,功能与 R.java 类似,用 @Bindable标记过 getter方法会在BR中生成一个静态常量。

到此,DataBinding的基本使用就讲解完成了。很简单吧?!
 

  • 作者:尹中文
  • 原文链接:https://blog.csdn.net/yzwfeng/article/details/124593660
    更新时间:2023-03-13 08:35:16