[Android Jetpack架构]数据绑定

androidx.databinding 数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。

传统修改布局元素属性调用以下代码:

TextView textView = findViewById(R.id.sample_text);
textView.setText(viewModel.getUserName());

在布局文件中使用数据绑定库将文本直接分配到微件。这样就无需调用上述任何 Java 代码:

<TextView
	android:text="@{viewmodel.userName}" />

使用数据绑定的好处

借助布局文件中的绑定组件,您可以移除 Activity 中的许多界面框架调用,使其维护起来更简单、方便。还可以提高应用性能,并且有助于防止内存泄漏以及避免发生 Null 指针异常。

快速开始

1.修改build.gradle

在应用模块级别下的build.gradle配置文件中添加以下配置:

android {
    ......
    dataBinding {
        enabled = true
    }
}

2.修改布局文件

在布局文件中添加<layout>元素作为根元素,然后在<layout>元素中添加<data>元素指示绑定的数据名称与类型。

修改前

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{user.firstName}"/>
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{user.lastName}"/>
</LinearLayout> 

修改后

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
   		<!-- name指定属性名称,type指定属性类型 -->
       <variable name="user" type="com.example.User"/>
       <!-- 上面可以替换为以下代码 
		<import type="com.example.User"/>
        <variable name="user" type="User"/>
		-->
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

3.修改Activity代码

import androidx.databinding.DataBindingUtil;
import com.example.User;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // setContentView(R.layout.activity_main);
    
	/* ActivityMainBinding对象是由布局文件名称activity_main.xml自动生成出来的 */
    ActivityMainBinding binder = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binder.setUser(new User("firstName", "lastName"));

}
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页