DataBinding是2016年谷歌新出的一种技术,相对当前使用较多的其他三方注入框架,DataBinding有引入简单,操作简单,占用体积小的有点。这里只是对DataBinding注入布局的控件demo,没有做数据的绑定。
1.引入
项目Modual.app中,在build.gradle添加
android{
...
dataBinding{
enabled true
}
}
2.布局中使用
<?xml version="1.0" encoding="utf-8"?>
<layout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
</layout>
在布局中操作如上,在布局最外层嵌套议程<layout></layout>的标签,AS就会自动帮你生成以你布局名称的Binding文件。如果布局文件名字是activity_main,那么生成的Binding文件就是ActivityMainBinding.
3.Java代码中使用
在布局中添加<layout>...</layout>之后,怎么在Java中使用呢?
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = (DataBindingUtil.setContentView(this,R.layout.activity_main));
initViews();
}
private void initViews(){
binding.textHello.setText("this is a DataBinding Demo");
}
}
见代码中,定义一个自定生成的DataBinding的对象,然后通过DataBindingUtil将DataBinding添加到Java文件中来。
然后就可以使用binding获取在布局文件中定义的各个控件进行操作了。使用很简单吧。欧耶~的确是这样
4.深化处理
如果每一个类都这样写,那不得累死啊。咱们做技术的需要总结共性,写一个基类,这对于大家来讲太小case了。下边就实现一个DataBinding的基类
public abstract class BindingActivity<B extends ViewDataBinding, P extends BasePresenter> extends FragmentActivity{
protected B binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, createLayoutId());
}
protected abstract int createLayoutId();
}
好了,这个基类就包含了DataBinding的初始化操作,其他的Activity 继承于BindingActivity就可以了。就是这么简单,再也不用写那么多烦人的控件名和findViewById()的代码了。
5.总结
DataBinding 有其他功能,包括数据与View的绑定。DataBinding在某些特殊情况下还是不能完全替代写View的场景。譬如在一个Adapter(有限个Item)中需要针对以某个Item中的View做处理等。
简单demo地址如下(希望对你有帮助):
https://github.com/wzp09tjlg/2016_T_point.git