DataBinding的基本使用(二)
DataBinding基本使用包括以下内容:
- 单纯的摆脱findviewbyid
- 绑定基本数据类型及String
- 绑定Model数据
- 绑定事件
- 通过静态方法转换数据类型
- 通过运算符操作数据
- 自定义Binding的类名
- 绑定相同Model的操作
- model变量改变自动更新数据
- 绑定List/Map等集合数据
- Observable自动更新
- Databinding与include标签的结合
- DataBinding与RecyclerView的结合
3.5通过静态方法转化数据类型
布局文件
<?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();
}
}
3.6通过运算符操作数据
布局文件
<?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)语法 ‘??’
3.7自定义Binding的类名
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);