DataBinding使用填坑

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 就会同步更新。

你可能感兴趣的:(android)