JetPack 之 DataBinding 的使用

android 几年前推出了 Jetpack 控件,其中有个 DataBinding ,这个框架能极大的简化我们需要写 findViewById()、setText()、setVisibility()、setEnabled() 以及 setOnClickListener() 等等方法,避免我们写一大堆代码。这个框架也比较好用,直接在 build.gradle  中配置以下脚本即可

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


我们先定义一个 bean 对象,然后再 xml 布局中引入该 bean 的全路径,示例如下


public class UserBean {

    public int age;
    public String name;

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

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

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

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

}

xml 布局, 以 layout 为节点, 来引入数据类型

activity_live_da:




    
          
    

    

        

        
             
    


Activity 中的代码也比较简单

public class LiveDaActivity extends BaseActivity {

    ActivityLiveDaBinding liveDaBinding;
    UserBean bean;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live_da);

        ViewDataBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_live_da);
        liveDaBinding = (ActivityLiveDaBinding) viewDataBinding;

        bean = new UserBean(18, " Death ");
        bean.isAdult = true;
        liveDaBinding.setUser(bean);
    }

    public void click(View view){
        bean.setAge(38);
        liveDaBinding.setUser(bean);
    }

}


运行后,我们发现 UI 界面上会显示 Death  和 age: 18  的字样,如果我们点击了显示 Death 的按钮,年龄的控件则会变为 age: 38。

上面只是最基本的写法,通过 liveDaBinding.setUser(bean); 设置 bean 来刷新界面,如果我们在点击事件中不想重新调用 setUser(bean) 怎么办?可以使用 BaseObservable 这个抽象类,让 UserBean 去继承它,用 @Bindable 注解来修饰 get 方法,在 set 方法中调用 notifyPropertyChanged() 方法

public class UserBean extends BaseObservable {

    public int age;
    public String name;


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

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

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

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

    public String getName() {
        return name;
    }

}


关于 notifyPropertyChanged(BR.age) 中的参数,我们在 getAge() 方法上添加 @Bindable 注解后,编译一下,BR 里面会自动添加 age 这个属性。

关于 BaseObservable ,系统提供了一些子类,是关于基本数据类型的,比如说 ObservableBoolean、ObservableByte 等,如果要用 String 或者自定义对象类型的,可以使用 ObservableField 这个类,比如在上述 xml 中 ConstraintLayout 节点里面添加新的控件

 

    


             
UserBean 中:

public class UserBean {

    public int age;
    public String name;
    public final ObservableField lastName = new ObservableField<>();


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

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

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

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

}


Activity 中的 click 点击事件

     public void click(View view){
        bean.lastName.set("abc");
    }

点击后就可以看到效果了。关于点击事件的注册,我们也可以移到其他的类里面,比如说上述xml中,可以写成 android:onClick="@{user.click}" ,然后在 UserBean 中定义 click 方法,

    public void click(View view){
        Log.e("UserBean", "UserBean  click: " + view);
    }

点击后,可以看到打印日志。

xml 中的 节点里的 可以是多个的,上面是把数据和点击都放在 UserBean 中,可以也可以拆分开来,比如

    
          

          
    


    

Activity 中记得把 Present 也设置一下,

liveDaBinding.setPresent(new Present());

public class Present {

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.userName:
                ...
                break;
        }
    }

}

这样就可以了。

你可能感兴趣的:(Android,知识)