1.DataBinding介绍
2015年谷歌I/O大会上介绍了一个框架DataBinding,DataBinding是一个数据绑定框架,以前我们在Activity里写很多的findViewById,现在如果我们使用DataBinding,就可以抛弃findViewById。DataBinding主要解决了两个问题:
- 需要多次使用findViewById,损害了应用性能且令人厌烦
- 更新UI数据需切换至UI线程,将数据分解映射到各个view比较麻烦
2.DataBinding的导入
在应用的build.gradle文件中添加如下代码:
android { ... //导入dataBinding支持 dataBinding{ enabled true } ... }
3.DataBinding基本使用包括以下内容:
- 单纯的摆脱findviewbyid
- 绑定基本数据类型及String
- 绑定Model数据
- 绑定事件
- 通过静态方法转换数据类型
- 通过运算符操作数据
- 自定义Binding的类名
- 绑定相同Model的操作
- model变量改变自动更新数据
- 绑定List/Map等集合数据
- Observable自动更新
- Databinding与include标签的结合
- DataBinding与RecyclerView的结合
3.1单纯的摆脱findviewbyid
布局文件
<!--布局以layout作为根布局--> <layout> <!--我们需要展示的布局--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.administrator.myapplication.MainActivity"> <Button android:id="@+id/main_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="您好" /> </LinearLayout> </layout>
布局通过DataBindingUtils.setContentView()或是DataBindingUtils.inflate()加载到代码中,而且会生成对应一个Binding对象,对象名是布局文件文称加上Binding后缀
MainActivity中代码
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding;//这个类是自动生成的 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //通过DataBInding加载布局都会对应的生成Binding对象,如ActivityMainBinding,对象名在布局文件名称后加上了一个后缀Binding binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main); //通过binfding.id名称---就相当于获取了改控件对象了 binding.mainTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { binding.mainTv.setText("您好,欢迎观看!"); } }); } }
通过Binding对象.id名称,就相当于拿到了指定的布局中的id的控件了,使用起来和findviewbyid获取的控件是一样的
注意:如果编译过后自动生成该类还是错误如:下图左,自己手动引入上去要如:下图右。
3.2绑定基本数据和String
布局文件
<?xml version="1.0" encoding="utf-8"?> <!--布局以layout作为根布局--> <layout> <data> <!--绑定基本数据类型及String--> <!--name: 和java代码中的对象是类似的,名字自定义--> <!--type: 和java代码中的类型是一致的--> <variable name="content" type="String" /> <variable name="enabled" type="boolean" /> </data> <!--我们需要展示的布局--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--绑定基本数据类型及String的使用是通过 @{数据类型的对象} 通过对应数据类型的控制显示--> <Button android:id="@+id/main_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="@{enabled}" android:text="@{content}" /> </LinearLayout> </layout>
在布局中是通过@{}来绑定数据的,{}中是布局中该控件属性对应的数据类型数据,同时还可以支持运算符运算和静态方法调用和转换,这个后面会介绍
MainActivity文件中
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding;//这个类是自动生成的 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //通过DataBInding加载布局都会对应的生成Binding对象,如ActivityMainBinding,对象名在布局文件名称后加上了一个后缀Binding binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main); //2.绑定基本数据类型及String binding.setContent("对String类型数据的绑定");//setContent就是给布局文件text属性绑定的content设置值 binding.setEnabled(false);//设置enabled值为false //给控件设置点击事件,发现其实点击无效,因为在布局文件中给cilckable属性绑定了enabled,在代码中设置enabled值为 //通过binfding.id名称---就相当于获取了改控件对象了 binding.mainTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { binding.mainTv.setText("您好,欢迎观看!"); } }); } }
3.3绑定model数据
Model数据类型
public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
后面会对model数据做更详细的讲解,这里先让大家知道一下用法
布局文件
<?xml version="1.0" encoding="utf-8"?> <!--布局以layout作为根布局--> <layout> <data> <!--绑定Model数据2中形式,一中是导入该类型的,一种指定类型的全称,和java一样--> <!-- 方式一 --> <variable name="user" type="com.example.administrator.myapplication.User" /> <!-- 方式二 --> <!--<import type="com.example.administrator.myapplication.User" />--> <!--<variable--> <!--name="user"--> <!--type="User" />--> </data> <!--我们需要展示的布局--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--绑定基本数据类型及String的使用是通过 @{数据类型的对象} 通过对应数据类型的控制显示--> <Button android:id="@+id/main_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{user.name}" /><!--这里user.name相当于user.getName()--> </LinearLayout> </layout>
MainActivity
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding;//这个类是自动生成的 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //通过DataBInding加载布局都会对应的生成Binding对象,如ActivityMainBinding,对象名在布局文件名称后加上了一个后缀Binding binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main); //3.绑定model对象数据 User user = new User(); user.setName("绑定Model数据类型"); binding.setUser(user);//或者 binding.setVariable(BR.user,user); //通过binfding.id名称---就相当于获取了改控件对象了 binding.mainTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { binding.mainTv.setText("您好,欢迎观看!"); } }); } }
binding设置数据有2中方式:1.binding.setUser(user) 2.binding.setVariable(BR.user,user)–采用BR指定