DataBinding基本使用包括以下内容: - 单纯的摆脱findviewbyid - 绑定基本数据类型及String - 绑定Model数据 - 绑定事件 - 通过静态方法转换数据类型 - 通过运算符操作数据 - 自定义Binding的类名 - 绑定相同Model的操作 - model变量改变自动更新数据 - 绑定List/Map等集合数据 - Observable自动更新 - Databinding与include标签的结合 - DataBinding与RecyclerView的结合
布局文件
<?xml version="1.0" encoding="utf-8"?><!--布局以layout作为根布局--> <layout> <data> <variable name="user" type="www.zhang.com.databinding.User" /> <!--调用静态方法,需要先导入需要的包 当然java中的lang包可以不用导包--> <import type="www.zhang.com.databinding.Utils" /> </data> <!--我们需要展示的布局--> <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="www.zhang.com.databinding.MainActivity"> <Button android:id="@+id/main_btn5" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{Utils.getName(user)}" /><!--就和java中写代码一样,只要符合数据类型就好--> </LinearLayout> </layout>静态方法的类(当然也可以使用java自带API)
public class Utils { public static String getName(Object o) { return o.getClass().getName(); } }布局文件
<?xml version="1.0" encoding="utf-8"?><!--布局以layout作为根布局--> <layout> <data> <variable name="user2" type="www.zhang.com.databinding.model.User" /> </data> <!--我们需要展示的布局--> <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="www.zhang.com.databinding.MainActivity"> <Button android:id="@+id/main_btn5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="@{user2.state ? @dimen/largepadding : (int)@dimen/smallpadding}" android:text="@{user2.content ?? @string/app_name}" /> <!-- android:text="@{user2.content ?? @string/app_name}" 等价于 android:text="@{user2.content!=null? user2.content : @string/app_name}"--> <Button android:id="@+id/main_btn6" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{`Hello World`+ @string/app_name}" /><!-- ``字符包裹的表示字符串,可用作拼接字符串 --> </LinearLayout> </layout> public class User { private String content; private boolean state; public User(String content, boolean state) { this.content = content; this.state = state; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public boolean isState() { return state; } public void setState(boolean state) { this.state = state; } }MainActivity中
package www.zhang.com.databinding; import android.databinding.DataBindingUtil; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Toast; import www.zhang.com.databinding.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //通过DataBInding加载布局都会对应的生成一个对象,如ActivityMainBinding,对象名在布局文件名称后加上了一个后缀Binding binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main); //运算符操作 www.zhang.com.databinding.model.User user2 = new www.zhang.com.databinding.model.User("通过运算符操作数据", true); // user2 = new www.zhang.com.databinding.model.User(null, false); 改变数据作为测试DataBinding是否有效 binding.setUser2(user2); } }DataBinding支持的表达式有:
数学表达式: + - / * %
字符串拼接 +
逻辑表达式 && ||
位操作符 & | ^
一元操作符 + - ! ~
位移操作符 >> >>> <<
比较操作符 == > < >= <=
instanceof
分组操作符 ()
字面量 - character, String, numeric, null
强转、方法调用
字段访问
数组访问 []
三元操作符 ?:
聚合判断(Null Coalescing Operator)语法 ‘??’
data标签有个class属性,它可以用来对Binding对象重新命名(一般是以布局文件名加上Binding后缀作为该Binding类名)
文件目录如下
自定义类名有3中方式 1. 通过指定全类名的方式
<data class="www.zhang.com.databinding.activity.Item"> ... </data> import www.zhang.com.databinding.activity.Item; Item binding = DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five); 直接生成在项目的包目录下 <data class=".Item"> ... </data> import www.zhang.com.databinding.Item; Item binding = DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five); 如果FiveActivity直接在包下与方式二相同,如果FiveActivity在包的子目录下,则Binding生成的目录如下 <data class="Item"> ... </data> import www.zhang.com.databinding.databinding.Item; Item binding =DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);