[Android][Jetpack] DataBinding的基本使用

简单使用

在需要使用DataBinding的模块的build.gradle中增加

android {
    //...
    defaultConfig {
        //...
        dataBinding{
            enabled true
        }
    }
}

然后同步

新建一个继承自BaseObservable的类

public class User extends BaseObservable {

    private String name;

    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

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

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

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

在需要绑定的字段的get方法上增加@Bindable注解,在set方法里增加notifyPropertyChanged(com.wangyz.jetpack.BR.name)

build工程

新建布局文件,在布局最外层的节点上按alt+enter,在弹出的选项中选择Convert to data binding layout,布局就会转换成DataBinding格式的布局。

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

    <data>

        <variable
            name="user"
            type="com.wangyz.jetpack.databinding.User" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <Button
            android:onClick="update"
            android:text="更新"
            android:layout_width="match_parent"
            android:layout_height="50dp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:text="@{user.name}" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:text="@{String.valueOf(user.age)}" />

    </LinearLayout>
</layout>

转换后的布局,会将layout作为最外层的节点,还会在里面增加一个data节点。我们需要在这个data节点中增加variable节点,并配置nametype属性。name命名随意,type输入前面定义的User类。

对需要绑定的控件属性,如text赋值为@{user.name},意思是给text属性赋值为前面绑定的User类的name。这样当User的name发生改变时,控件的text属性就会自动改变。

在Activity中绑定User和布局

public class DataBindingActivity extends AppCompatActivity {

    User user;

    ActivityDatabindingBinding binding;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_databinding);
        user = new User("张三", 18);
        binding.setUser(user);
    }

    public void update(View view) {
        user.setName(user.getName() + "$");
        user.setAge(user.getAge() + 1);
        binding.setVariable(com.wangyz.jetpack.BR.user, user);
    }
}

通过DataBindingUtil.setContentView(this, R.layout.activity_databinding)来绑定,并返回Binding,然后通过Binding的setUser方法,就可以给布局设置数据。

猜你喜欢

转载自blog.csdn.net/xfb1989/article/details/110874038