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:
<?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 中的 节点里的
Activity 中记得把 Present 也设置一下,
liveDaBinding.setPresent(new Present());public class Present { public void onClick(View view) { switch (view.getId()) { case R.id.userName: ... break; } }}
这样就可以了。
更多相关文章
- android布局动画实现方法
- ANDROID多点触控API接口的使用
- Android应用程序执行流程
- Android的Btimap处理大图片解决方法
- 【Android】TextView动态设置android:drawableLeft|Right|Top|Bo
- Android中如何将dp,dip,sp与px相互转化
- Android屏幕元素层次结构
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用