DataBinding使用填坑

xiaoxiao2021-02-28  83

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 类型的变量

<variable name="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}" /> <!-- 这里TextView直接引用第一次TextView,firstName为id 的驼峰命名 -->

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 布局中。

<?xml version="1.0" encoding="utf-8"?> <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<String>"/> <variable name="sparse" type="SparseArray<String>"/> <variable name="map" type="Map<String, String>"/> <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 就会同步更新。

转载请注明原文地址: https://www.6miu.com/read-85357.html

最新回复(0)