1、
<data class="TestBinding4">
<import type="com.xxxx.app.ui.ask.AskListViewModel" />
<variable
name="vmodel"
type="AskListViewModel" />
</data>
class声名的类名即build后所生成的ViewDataBinding的名字,当场改完并不会即使生成,需要rebuild一下工程才可以。
2、
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="jlkasdjflasjflas"
android:onClick="@{vmodel::clickTest}" />
LinearLayout>
onClick点击事件的vmodel调用的方法clickTest的方法定义形参一定要写上View view:
public void clickTest(View view) {
Toast.makeText(cxt, "wxbnb", Toast.LENGTH_SHORT).show();
}
3、xml中data标签只是绑定model的声名,切记要在代码中进行数据绑定:
public class TestBinding extends BaseActivity {
private TestBinding4 binding;
private AskListViewModel vModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
binding = DataBindingUtil.setContentView(this, R.layout.activity_test_binding);
super.onCreate(savedInstanceState);
vModel = new AskListViewModel(this);
binding.setNima(vModel);//真实绑定model
}
}
4、java.lang.* 包中的类会被自动导入,可以直接使用,例如, 要定义一个 String 类型的变量
"test" type="String" />
5、可以在表达式中直接引用带 id 的 view,引用时采用驼峰命名法。
1
2
3
4
5
6
7
8
9
10
11
12
<TextView
android:id="@+id/first_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={user.firstName}" />
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{firstName.getVisibility() == View.GONE ? View.GONE : View.VISIBLE}" />
6、binding 类会生成一个命名为 context 的特殊变量(其实就是 rootView 的 getContext() ) 的返回值),这个变量可用于表达式中。 如果有名为 context 的变量存在,那么生成的这个 context 特殊变量将被覆盖。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{handler.loadString(context)}"/>
public String loadString(Context context) {
// 使用生成的context变量
return context.getResources().getString(R.string.string_from_context);
}
7、在使用应用命名空间的布局中,变量可以传递到任何 include 布局中。
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.connorlin.databinding.model.User"/>
data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/include"
app:user="@{user}"/>
LinearLayout>
layout>
9、容器类
通用的容器类:数组,lists,sparse lists,和 maps,可以用 [] 操作符来存取
<data>
<import type="android.util.SparseArray"/>
<import type="java.util.Map"/>
<import type="java.util.List"/>
<variable name="list" type="List" />
<variable name="sparse" type="SparseArray" />
<variable name="map" type="Map" />
<variable name="index" type="int"/>
<variable name="key" type="String"/>
</data>
…
android:text="@{list[index]}"
…
android:text="@{sparse[index]}"
…
android:text="@{map[key]}"
10、字符串常量
使用单引号把属性包起来,就可以很简单地在表达式中使用双引号:
android:text='@{map["firstName"]}'
11、数据对象 (Data Objects)
任何 POJO 对象都能用在 Data Binding 中,但是更改 POJO 并不会同步更新 UI。Data Binding 的强大之处就在于它可以让你的数据拥有更新通知的能力。
有三种不同的动态更新数据的机制:
Observable 对象
Observable 字段
Observable 容器类
当以上的 observable 对象绑定在 UI 上,数据发生变化时,UI 就会同步更新。