引入DataBinding
在你的app下的build.gradle中添加对DataBinding的支持
android { ... //第一步:引入dataBinding dataBinding { enabled = true } }
- 更改你的xml布局,对dataBinding的支持
<?xml version="1.0" encoding="utf-8"?> <!-- 第二步:在布局中跟节点添加layout --> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="tsou.cn.databinding.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入 Frist Name" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入 Last Name" /> <TextView android:id="@+id/first_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/last_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </layout>
- 在MainActivity中使用dataBinding绑定你的xml布局,并代替findviewbyid
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); User user = new User(); user.setFristName("huang"); user.setLastName("xiaoguo"); // 第三步:使用 ActivityMainBinding /** * Android studio会根据layout文件自动生成一个默认的Binding类, * 类名是根据layout文件名生成的, * 并有"Binding"后缀结束。 * 例如:activity_main.xml生成的Binding类为ActivityMainBinding * * 如果ActivityMainBinding,无法找到,可以先编译一下项目 */ ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); /** * 解决问题之:findviewbyId */ binding.firstName.setText(user.getFristName()); binding.lastName.setText(user.getLastName()); }
- 在xml中添加data数据绑定标签
<?xml version="1.0" encoding="utf-8"?> <!-- 第二步:在布局中跟节点添加layout --> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <!-- 第四步:xml数据绑定,name表示数据对象名称 type:表示包名 --> <data> <variable name="user" type="tsou.cn.databinding.bean.User"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="tsou.cn.databinding.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入 Frist Name" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入 Last Name" /> <TextView android:text="@{user.fristName}" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:text="@{user.lastName}" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </layout>
- 将activity中的数据绑定到xml中
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); User user = new User(); user.setFristName("huang"); user.setLastName("xiaoguo"); // 第三步:使用 ActivityMainBinding ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); /** * 将数据绑定到xml */ // 方法一:(常用) //binding.setUser(user); //方法二: binding.setVariable(BR.user,user); } }
- 创建Presenter类
public class Presenter{ //普通方法绑定 public void onTextChanged( CharSequence s,int start,int before,int color){ user.setFristName(s.toString()); binding.setUser(user); } //普通方法绑定 public void onClick(View view){ Toast.makeText(MainActivity.this.getApplicationContext(),"点击了",Toast.LENGTH_LONG).show(); } //监听器绑定,可以返回数据 public void onClickListenerBinding(User user){ Toast.makeText(MainActivity.this.getApplicationContext(),user.getLastName(),Toast.LENGTH_LONG).show(); } }
- 在xml中传入presenter并进行绑定
<?xml version="1.0" encoding="utf-8"?><!-- 第二步:在布局中跟节点添加layout --> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <data> <!-- 第四步:xml数据绑定,name表示数据对象名称 type:表示包名 --> <variable name="user" type="tsou.cn.databinding.bean.User" /> <!-- 第五步:事件绑定 name:类名 type:表示包名 --> <variable name="presenter" type="tsou.cn.databinding.MainActivity.Presenter" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="tsou.cn.databinding.MainActivity"> <!-- 建议使用 android:onTextChanged="@{presenter::onTextChanged}" 可以将方法的绑定和普通函数的调用或数据绑定,区分开 --> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入 Frist Name" android:onTextChanged="@{presenter.onTextChanged}" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入 Last Name" /> <!-- 普通方法绑定 建议使用 android:onClick="@{presenter::onClick}" 可以将方法的绑定和普通函数的调用或数据绑定,区分开 --> <TextView android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{presenter.onClick}" android:text="@{user.fristName}" /> <!-- 监听器绑定,可以返回数据 --> <TextView android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{()->presenter.onClickListenerBinding(user)}" android:text="@{user.lastName}" /> </LinearLayout> </layout>
- acticity中绑定Presenter对象
binding.setPresenter(new Presenter());
- 效果如下:
支持的运算符:
- 数学运算符: + - / * %
- 字符串拼接: +
- 逻辑运算符: && ||
- 二进制: & | ^
- 一元运算符: +
- 位运算符: >> >>> <<
- 比较: == > < >= <=
- instanceof
- ()
- 数据类型: character, String, numeric, null
- 类型转换(ClassCast)
- 方法回调(Method calls)
- 数据属性
- 数组:[]
- 三元操作符:?
例如:
android:text="@{String.valueOf(index + 1)}" android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}" android:transitionName='@{"image_" + id}'
一些在java中常用而DataBinding xml中不支持的:
- this
- super
- new
- 泛型
空合并运算符
android:text="@{user.displayName ?? user.lastName}" 等价于 android:text="@{user.displayName != null ? user.displayName : user.lastName}"
未完待续…………………………
文章来源: android:DataBinding使用小结