Android Jetpack 架构浅析( 五 )


3、此类包含从布局属性(例如,user 变量)到布局视图的所有绑定,并且知道如何为绑定表达式指定值 。
4、建议的绑定创建方法是在扩充布局时创建,如以下示例所示:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);User user = new User("Test", "User");binding.setUser(user);}a、Activity 数据绑定 ( DataBinding ) :

1、DataBindingUtil类方法:
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
2、生成的布局绑定类的inflate()方法:
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//DataBindingUtil类方法ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);//生成的布局绑定类的inflate()方法//ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());User user = new User("Test", "User");binding.setUser(user);}b、 Fragment、ListView 或 RecyclerView 适配器中使用数据绑定 ( DataBinding )
DataBindingUtil 或 生成的布局绑定类deinflate() 方法,如以下代码示例所示:
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);// orListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);Data Binding绑定表达式:xml里支持使用以下表达式:
  • 算术运算符 + - / * %
  • 字符串连接运算符 +
  • 逻辑运算符 && ||
  • 二元运算符 & | ^
  • 一元运算符 + - ! ~
  • 移位运算符 >> >>> <<
  • 比较运算符 == > < >= <=(请注意,< 需要转义为 <)
  • instanceof
  • 分组运算符 ()
  • 字面量运算符 - 字符、字符串、数字、null
  • 类型转换
  • 方法调用
  • 字段访问
  • 数组访问 []
  • 三元运算符 ?:
不支持以下表达式:
  • this
  • super
  • new
  • 显式泛型调用
a、变量
1、生成的数据绑定代码会自动检查有没有 null 值并避免出现 Null 指针异常 。
2、例如,在表达式 @{user.name} 中,如果 user 为 Null,则为 user.name 分配默认值 null 。
3、如果您引用 user.age,其中 age 的类型为 int,则数据绑定使用默认值 0 。
<!--变量给控件赋值-->android:text="@{user.name}"<!--控件给变量赋值(双向绑定)-->android:text="@={user.name}"b、Null 合并运算符(空运算符)
如果左边运算数不是 null,则 Null 合并运算符 (??) 选择左边运算数,如果左边运算数为 null,则选择右边运算数 。
android:text="@{user.displayName ?? user.lastName}"//等效于如下三目表达式android:text="@{user.displayName != null ? user.displayName : user.lastName}"c、视图引用
1、表达式可以通过以下语法按 ID 引用布局中的其他视图:
2、绑定类将 ID 转换为驼峰式大小写 。
3、在以下示例中,TextView 视图引用同一布局中的 EditText 视图:android:text="@{exampleText.text}"
<EditTextandroid:id="@+id/example_text"android:layout_height="wrap_content"android:layout_width="match_parent"/><TextViewandroid:id="@+id/example_output"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{exampleText.text}"/>d、显示隐藏控制
1、首先在 xml 的 data 节点中引用View
2、然后设置visibility
<data><import type="android.view.View"/></data>android:visibility="@{student.boy ? View.VISIBLE : View.INVISIBLE}"e、事件处理方法引用:
android:onClick="@{handlers::onClickFriend}"
绑定表达式可将视图的点击监听器分配给MyHandlers 类的 onClickFriend() 方法,如下所示:
public class MyHandlers {public void onClickFriend(View view) { ... }}<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variable name="handlers" type="com.example.MyHandlers"/><variable name="user" type="com.example.User"/></data><LinearLayoutandroid: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}"android:onClick="@{handlers::onClickFriend}"/></LinearLayout></layout>


推荐阅读