欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android UI开发利器-DataBinding(附Demo)

程序员文章站 2022-05-14 23:47:09
...

DataBinding是谷歌官方推出的一个数据/UI绑定框架,官方解释是

The Data Binding Library is a support library that allows you to bind UI components in your layouts to data sources in your app using a declarative format rather than programmatically.

简单的说就是它提供了一种数据和UI绑定的方法,UI元素可以自动的根据数据的更新而改变。
在没有DataBinding的情况下我们是这么更新视图的,
先通过findViewById实例化视图控件比如 TextView,
当数据发生改变时通过 setText 去更新UI。

DataBinding能让我们免除这一切重复的工作,下面会以最简单的例子说明如何使用它。DataBinding非常简单,以至于对于新手来说只要按照这篇内容,不用20分钟就可以掌握它的使用方法。

配置环境

DataBinding是Support Library里已经内置的框架,你所需要的只是在需要使用的模块的 build.gradle里加上这一句

android {
    ....

    dataBinding {
        enabled = true
    }
}

不需要添加更多的依赖,接下来就可以使用DataBinding了。

绑定数据和UI

DataBinding做的事情是把数据和视图绑定,那么我们先说说数据。
我们假定有一个数据bean叫UserInfo,它的结构是这样的

public class UserInfo{
    String name;
    int age;
}

为了使用DataBinding,首先要让UserInfo继承BaseObservable类,并且实现getter/setter。对于setter方法来说,需要在数据变更之后调用notifiyProperty方法,对于getter,需要用@Bindable注释。修改后的代码如下

public class UserInfo extends BaseObservable{
    String name;
    int age;

    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }

    @Bindable
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
        notifyPropertyChanged(BR.age);
    }
}

到这里就完成了大部分的准备工作了。接下来我们要修改layout文件,把需要绑定的UI元素和数据用注解关联起来。
对于这个例子来说,视图中的 name 和 age 是需要注解的部分,首先在layout文件中声明变量,

<data>
    <variable name="user" type="com.phoenix.databindingdemo.UserInfo"/>
</data>

以name为例子,修改TextView的 android:text属性为对变量 user.name的引用

<TextView
android:id="@+id/tv_name"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textColor="@android:color/black"
android:textSize="15sp"
android:text="@{user.name}"/>

对于age来说有些类似,但有个问题,因为UserInfo的age是 int类型,直接写 user.age作为引用的话会导致崩溃,
原因是int类型被当做资源索引作为参数,所以在对非String类型的属性进行设置的时候需要转换一下,
DataBinding考虑到这点,允许开发者在xml中使用Java语法进行转换,对于age来说layout会变成下面这样,

<TextView
android:id="@+id/tv_age"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textColor="@android:color/black"
android:textSize="15sp"
android:text="@{String.valueOf(user.age)}"/>

这里可以用String.valueOf对int类型的age进行转换。

下面进入正题,我们要把使用findViewById的调用都给去除了,同时要移除的还有 setText这样的调用,我们也不再需要它们了。
对于这个例子来说,我们定义的layout名字叫 activity_main.xml,DataBinding会自动帮我们生成类ActivityMainBinding,这就是我们的重点对象,下面是UI中的代码,

public class MainActivity extends Activity {
    UserInfo mUser;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        mUser = new UserInfo();
        binding.setUser(mUser);
    }

mUser就是我们需要绑定的数据对象,在绑定完成后,每次对mUser的数据进行修改,在UI上会直接更新,而不需要我们手动去调用 setText方法。

DataBinding的原理和Demo资源

可能很多朋友看到数据类所继承的 BaseObservable 类就明白,其实DataBinding是一种观察者模式,它只是帮我们生成了样板代码,实际上也是观察者中的 notify -> update 结构。对于这部分原理我们在下一篇文章里进行分析。
DataBinding是谷歌官方推出的框架,可以从下面这个链接上学习更多关于它的姿势,
https://developer.android.com/topic/libraries/data-binding/
关于DataBinding还有很多限于篇幅没有仔细说明,比如事件监听,还有对于Adapter类型的数据怎么绑定,都可以在上面的链接中了解到。

上面的例子代码可以在后台回复 “数据绑定” 获得,参考demo代码食用本篇文章效果更佳哦。
Android UI开发利器-DataBinding(附Demo)

相关标签: Android DataBinding