DataBinding基本使用包括以下内容:
- 单纯的摆脱findviewbyid
- 绑定基本数据类型及String
- 绑定Model数据
- 绑定事件
- 通过静态方法转换数据类型
- 通过运算符操作数据
- 自定义Binding的类名
- 绑定相同Model的操作
- model变量改变自动更新数据
- 绑定List/Map等集合数据
- Observable自动更新
- Databinding与include标签的结合
- DataBinding与RecyclerView的结合
布局文件
<layout>
<data>
<variable
name="user"
type="www.zhang.com.databinding.User" />
<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)}" />
LinearLayout>
layout>
静态方法的类(当然也可以使用java自带API)
public class Utils {
public static String getName(Object o) {
return o.getClass().getName();
}
}
布局文件
<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}" />
<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. 通过指定全类名的方式
"www.zhang.com.databinding.activity.Item">
...
import www.zhang.com.databinding.activity.Item;
Item binding = DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);
".Item">
...
import www.zhang.com.databinding.Item;
Item binding = DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);
"Item">
...
import www.zhang.com.databinding.databinding.Item;
Item binding =DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);