databinding这东西,两年前用过一次之后就没有再用了,毕竟公司没有这样的需求,东西久不用了肯定会生疏,生疏不要紧,只要在用到的时候能快速查到相关资料即可,那么最好的方法肯定就是自己写日志啦!
首先我们先说说databinding是什么,顾名思义,"数据绑定"!不知道大家有没有接触过MVVM框架,其实databinding可以说跟MVVM框架契合度是非常高的,他的数据绑定方式颠覆了原有的android原生的数据绑定方式,使用了databinding之后,你不会再看到类似findViewById()、setText()等等语句,你需要做的仅仅是改变数据即可,这也就是所谓的数据驱动型,至于什么是数据驱动型,大家不妨往下看,看完自然就能体会到了!!今天我们先用一个简单的例子去实现一个单向的数据绑定过程,并通过改变数据实现UI的刷新。后续会介绍更高级的使用方式,比如说数据双向绑定。
1、android2.1或更高平台
2、gradle 1.5或更高版本
3、android studio1.3或更高版本
4、启用databinding,只需要在Moudle的build.gradle中的android节点中加入下面配置即可:
android {
。。。
dataBinding{
enabled true
}
}
使用databinding之后,我们最直观的感受的的变化就是xml的变化,如果对jsp文件熟悉的朋友会发现其编写方式跟jsp有那么一点像的!,那么我们先看看我写的:
1、外层标签
首先我们看到,我们的xml文件中最外层已经不是LinearLayout之类的ViewGroup了,而是换成了layout标签,这个是固定的写法,大家记住就好。
2、
我们看到 节点,也是databinding特有的,这个data其实是整个xml文件的描述,程序在解析到data标签时,会把整个xml文件映射成一个MainUserBinding.calss的文件,内部维护了整个xml文件的所有元素,包括我们通过import导入的,我们去瞧瞧:
文件路径:build/intermediates/classes/debug/包名/databinding/MainUserBinding.class
public class MainUserBinding extends ViewDataBinding {
@Nullable
private static final IncludedLayouts sIncludes = null;
@Nullable
private static final SparseIntArray sViewsWithIds = null;
@NonNull
public final TextView age;
@NonNull
private final LinearLayout mboundView0;
@NonNull
public final TextView name;
@Nullable
private UserInfo mUserInfo;
private long mDirtyFlags = -1L;
//此处省略N行。。。。。
我们现阶段先别去纠结它的原理我们先能用起来,体验一下效果再说!还有就是class="MainUserBinding"这个不是必须的,这个值如果我们不定义的话,会根据xml文件名生成,如activity_main.xml会生成ActivityMainBinding.class,看个人喜欢!
3、variable节点
这个节点的作用是声明或者说是绑定一些我们需要使用的数据实体或者相关的对象,说得直白点就跟定义个变量差不多,其中name指定了所声明对象的名称,type为对象类型,在上面代码中我们使用了import的方式进行引入,其实这里是有一定用意的,这里只是想告诉大家,如果我们想要使用jdk中的类,也是可以import进来的。当然还有另外一种写法如下:
PS:这里的UserInfo只是一个普通的javabean,后面贴代码
4、数据绑定
我们看到声明好具体的数据对象之后,我们就可以使用该对象队具体的View进行数据绑定了,如下:
android:text="@{userInfo.name}"
android:text="@{String.valueOf(userInfo.age)}"
这里我们数据绑定的方式也是一种固定的写法,使用@{},值得注意的是,由于我们UserInfo里面定义的age是一个int类型的数据,但是TextView的text只能接受String类型的,所以我们使用String.value()转,但是我们并没有import java.lang.String ,其实java.lang包是默认已经被导入的了,可以直接使用!
1、首先先我们看下Activity中的实现
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
private UserInfo mUserInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainUserBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mUserInfo = new UserInfo("老王",18);
binding.setUserInfo(mUserInfo);//在xml中声明后编译自动生成get、set方法
}
}
我们看到原始的setContentView()被替换成了 DataBindingUtil.setContentView(),并且返回了对应的MainUserBinding对象,然后通过setUserInfo方法设置UserInfo对象,这里强调下,当我们使用variable去声明某个对象的时候,就会在MainUserBinding中自动生成对应的get和set方法。」
2、接着我们看下UserInfo
public class UserInfo {
public String name;
public int age;
public UserInfo(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
至此,我们的数据就真正的跟我们对应的View绑定上了,运行看下效果图:
我们刚开始的时候说databinding属于数据驱动型,按么我们接下来看看什么是数据驱动
1、首先我们创建一个Timer,每隔2秒钟就随机设置UserInfo中的年龄数据:
private void ininTimer() {
final Random random = new Random();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.d(TAG,"=======改变内容=======");
mUserInfo.setAge(random.nextInt(100));
}
},2000,2000);
}
页面有什么变化:
可以看到,我们的页面是跟着在刷新的,当然,不仅仅是加了上面那段代码就行的,我们还需要设置监听,我们只需要在所绑定的数据的实体类里面进行设置即可,如下:
public class UserInfo extends BaseObservable {
public String name;
public int age;
public UserInfo(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(BR.name);
}
@Bindable
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
notifyPropertyChanged(BR.age);
}
}
从上面代码中我们可以看出,首先需要继承BaseObservable,然后在对应的get方法中添加注解@Bindable,最后在对应的set方法中添加notifyPropertyChanged(BR.age);即可,注意,只有添加了注解的属性,才会在BR中生成对应的字段标识。
不知道大家注意到了没有,从改变数据一直到UI的刷新,我们都没有调用过类似TextView.setText()这样的方法,我们仅仅是改变数据而已,UI就自动刷新了,这就是我前面所说的数据驱动了!!!
在android开发中,我们不可避免的会去监听一些控件的触摸事件,我们这里就从一个button最简单的点击事件开始入手
1、创建事件监听的Event对象,并定义onEvent()方法,以View作为参数返回
public class Event{
public void onEvent(View view) {
Log.d(TAG,"Text="+((TextView)view).getText());
}
}
2、在data节点中声明该对象
3、添加Button按钮,并设置监听
这里的监听设置有好几种方式:
我们运行下点击看看效果:
总结:今天我们介绍了databinding如果引入,如何编写xml文件,如何在java中使用,如何设置事件监听等等,总得来说的只是databinding的一点点皮毛,就当先对它有个小小的印象吧!!毕竟这个框架也不是一天两天能搞透的。。。
Demo源码