本文解释如何使用Data Binding库编写声明式布局和最小化所需的粘合代码绑定应用程序逻辑和布局
使用:
环境搭建
为了使用数据绑定,需要先配置下build.gradle文件,使用以下代码配置数据绑定:
android {
....
dataBinding {
enabled = true
}
}
为了能快速生成Binding类,需要添加插件
在project中的build添加
classpath "com.android.databinding:dataBinder:1.0-rc0"
在module添加
apply plugin: 'com.android.databinding'
数据绑定布局文件
编写数据绑定表达式
数据绑定布局文件稍有不同,并从布局的根标记开始,后跟数据元素和视图根元素。 此视图元素是您的根将在非绑定布局文件中。 示例文件如下所示:
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.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>
数据中的variable描述了在此布局中可以使用的属性
<variable name="user" type="com.example.User"/>
布局中的表达式使用“@ {}”语法写在属性属性中。
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}"/>
数据对象
假设你有一个普通的Java对象:
public class User { private final String firstName; private final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return this.firstName; } public String getLastName() { return this.lastName; } }
绑定数据
默认情况下,将根据布局文件的名称生成Binding类,将其转换为Pascal大小写,并在其后面加上“Binding”。 上面的布局文件是main_activity.xml,所以生成类是MainActivityBinding。 这个类保存从布局属性(例如用户变量)到布局视图的所有绑定,并知道如何为绑定表达式分配值。创建绑定的最简单的方法是在渲染时执行:
这样就完成了! 运行应用程序,您将在UI中看到Test User。 或者,您可以通过以下方式获取视图:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); User user = new User("Test", "User"); binding.setUser(user); }
MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());
如果在ListView或RecyclerView适配器中使用数据绑定项,则可能希望使用:
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); //or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);