DataBinding(一)

DataBinding(一)

准备

再Module下的build.gradle中添加如下:

android{
    dataBinding{
        enabled = true
    }
}

1. 基础

在布局文件中,选中跟布局的ViewGroup,按住alt+回车键,点击“Convert to data binding layout”

由一个layout标签将原布局包裹,data标签用于声明要用到的变量及变量类型。

<data>
	<variable
		name=""    //用于在布局文件中引用
		type=""    //类的完整包名  />
		
</data>

如果需要引用多个,可用import导入

<data>
	<import type=""//类的完整包名/>
	<variable
		name=""
		type=""/>
</data>

若用import导入的类名相同,可用 alias 指定别名

若布局文件名为activity_main.xml,则会自动生成一个ActivityMainDataBinding类,在onCreate方法中,用 ActivityMainDataBinding binding = DataBindingUtil.setContentView()替换setContentView()方法。

每个数据绑定布局文件都会生成一个绑定类即activity_main.xml会生成一个ActivityMainDataBinding类。

也可以用如下方式自定义类名

<data class="">

</data>

2. 单向数据绑定

实现数据变化自动驱动UI刷新的方式有三种

1. BaseObservable

提供了notifyChange()和notifyPropertyChanged()方法,前者会刷新所有值,后者则只会书信对应的BR的值。BR通过@Bindable注解

  • 如果是public修饰的成员变量,则直接在成员变量的上方添加注解@Bindable
  • 如果是private修饰的成员变量,则在其get方法上添加注解@Bindable

2. ObservableField

ObservableField可以理解为官方对BaseObservable中的字段的注解和刷新等操作的封装,官方原生提供了对数据类型的封装。例如:ObservableBoolean,ObservableByte…,也可通过ObservableField泛型声明其他类型。

3. ObservableCollection

提供包装类用于替代原生的List和Map,分别是ObservableList和ObservableMap,当其包含的数据发生变化时,绑定的视图随之更新。

<data>
	<import type="android.databinding.ObservableList"/>
	<import type="android.databinding.ObservableMap"/>
	<variable
		name = "list"
		type="ObservableList&lt;String&gt;"/>
    <variable
    	name="map"
    	type="ObservableMap&lt;String,String&gt;"/>
</data>
		

单向绑定:android:text="@{testInfo.name}"

3. 双向绑定

双向数据绑定的意思即为当数据改变时同时使视图刷新,而试图改变时同时可以改变数据。

android:text="@={testInfo.name}

4. include

当在布局中添加引用布局时

<include layout="" bind:变量名:="@{外层布局中的实例}"/>

不支持include的根布局不是ViewGroup

5.事件绑定

1. 方法引用

在方法引用中,方法的参数与返回值必须与监听器对象的参数相匹配,方法名可以不同。

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onTextChanged="@{mainActivity.onChanged}"/>
public void onChanged(CharSequence s, int start, int before, int count) {
    test.setName(s.toString());

}

2. 监听器绑定

而在监听绑定中,只要返回值与监听器对象的预期返回值相匹配即可,可以自己设置参数。

<TextView
    android:text="@{testInfo.name}"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/textView"
    android:textSize="36sp"
    android:textStyle="bold"
    android:gravity="center"
    android:onClick="@{()->mainActivity.haha(testInfo.name)}"/>

public void haha(String name){
    Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
}

发布了31 篇原创文章 · 获赞 9 · 访问量 1599

猜你喜欢

转载自blog.csdn.net/qq_43621019/article/details/104037093