android:onClick=“inflateViewStub”
android:text=“Inflate the ViewStub”
/>
view_stub.xml 如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“horizontal”
代码如下:
// 设置 inflate 回调
mBinding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener()
{
@Override
public void onInflate(ViewStub stub, View view)
{
// 得到 Binding 实例
ViewStubBinding binding = DataBindingUtil.bind(view);
User user = new User(“liang”, “fei”);
binding.setUser(user);
}
});
// isInflated 是 DataBinding 自动生成的方法,不是 ViewStub 的方法。可用于判断是否已 inflate
if (!mBinding.viewStub.isInflated())
{
mBinding.viewStub.getViewStub().inflate();
}
这个特别有用,因为可以判断 ViewStub 是否已经 inflate。
6. 支持双向绑定
比如 EditText,绑定了 LiveData,当 EditText 内容改变的时候,LiveData 的内容也会跟着变化。如下:
关键就是 @={},如此一来,我们就可以直接在 ViewModel 中取得 EditText 的内容数据了,因为 ViewModel 是不可以持有 View 实例的,所以如果没有 DataBinding,要获取 EditText 就只能通过 View 传给 ViewModel。有了 DataBinding 就方便多啦。
内置支持双向绑定的属性如下:
当然我们还可以自定义双向绑定的,后面再来说这个。
7. 支持绑定方法
上面我们的所有操作,都是绑定的变量,能绑定方法吗?当然可以。我们通过 onClick 事件来举例。
val onClick = View.OnClickListener {
Log.i(“MainViewModel”, “commonLog - onClick: 变量”)
}
fun onClick(v: View) {
Log.i(“MainViewModel”, “commonLog - onClick: 方法”)
}
fun onClick() {
Log.i(“MainViewModel”, “commonLog - onClick: 没有参数,或者有参数也行,但是 xml 中也必须给它传对应的值”)
}
其中双冒号 :: 绑定方法的签名必须和属性要求的对象方法签名一致。这里即 OnClickListener 的 onClick 方法。同样的,如果是 onLongClick 监听,那就要求你的方法有返回 Bool 值了。
第三种是表达式的写法,我们下面会说,学过 Java8 的都知道箭头 -> 和双冒号 :: 是 Lambda 表达式。
8. 支持表达式
DataBinding 支持部分表达式,还支持 Lambda 表达式,如上的点击事件,但是建议不要过于复杂,因为 DataBinding 不支持单元测试的,报错也不是很智能。支持的运算符和关键字如下:
没有 this、super、new 和显式泛型调用。示例如下:
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"
android:transitionName=’@{“image_” + id