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:

<?xml version="1.0" encoding="utf-8"?>                                                       


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;        }    }}

这样就可以了。

更多相关文章

  1. android布局动画实现方法
  2. ANDROID多点触控API接口的使用
  3. Android应用程序执行流程
  4. Android的Btimap处理大图片解决方法
  5. 【Android】TextView动态设置android:drawableLeft|Right|Top|Bo
  6. Android中如何将dp,dip,sp与px相互转化
  7. Android屏幕元素层次结构
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. 2021年逢面必考的10道测试用例面试题,别怪
  2. 30 张快速学习 Java 的思维导图
  3. 怎么给女朋友讲明白线程池?
  4. Hive底层原理:explain执行计划详解
  5. 面试官:讲一下Jvm中如何判断对象的生死?
  6. 一个好Java程序员,是无码胜有码,你懂这话的
  7. jvm的那些设置参数你都知道吗
  8. Java对象为啥要实现Serializable接口?
  9. 选择Java程序员后,怎么才能逐渐脱离码农的
  10. 不重启JVM,替换掉已经加载的类,偷天换日?