DataBinding(四):布局include和ViewStub
在学习DataBinding绑定语法的时,忽略了布局中的两个特殊元素:include复用布局和ViewStub懒加载布局。对于这两种该如何在布局中使用DataBinding呢?
1、include
单独啰嗦记录一下DataBinding中的include传值方法。
1.1、定义复用布局
需要将之前定义的复用的布局也转换成data binding layout布局,详见DataBinding:开启数据绑定。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="nickName"
type="String" />
</data>
<LinearLayout>
<TextView
android:text="@{nickName}" />
</LinearLayout>
</layout>
1.2、include复用布局
使用<include layout = "布局id">引用复用上面的布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data class="MainLayoutBinding">
<variable
name="name"
type="String" />
</data>
<LinearLayout>
<include
layout="@layout/common_layout"
bind:nickName="@{name}" />
</LinearLayout>
</layout>
1.3、bind传递变量
使用bind:变量2="@{变量1}"语法,将当前data binding layout中定义的变量1传递给include布局中的变量2。
<include
layout="@layout/common_layout"
bind:nickName="@{name}" />
就可以在include的布局中使用传递后的变量了。
<TextView
android:text="@{nickName}" />
2、ViewStub
ViewStub用到过很多次了,实际上程序员为了省事不在乎那点加载性能而很少用它。ViewStub用法采坑详见ViewStub懒加载。这东西好用,但是不注意会采坑。
2.1、引用ViewStub
在布局中使用<ViewStub />标签引用懒加载布局,因为需要后面使用到ViewStub,所以必须要给它一个id。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="name"
type="String" />
</data>
<LinearLayout>
<ViewStub
android:id="@+id/view_stub"
android:layout="@layout/common_layout"
bind:nickName="@{name}" />
</LinearLayout>
</layout>
2.2、获取ViewStub
之前学习DataBinding语法的时候知道布局中定义的id转换成驼峰命名法就是对于的对象名,但是对于ViewStub。这里viewStub并不是ViewStub类型的实例。
DataBinding库中专门有一个ViewStubProxy类代理ViewStub,通过它我们可以getViewStub()到布局中预先设置的ViewStub:
ViewStub viewStub = dataBindingBinding.viewStub.getViewStub();
在需要的时候infalte或者setVisibility(View.VISIBLE)即可。注意ViewStub只能inflate一次,所以上面通过ViewStubProxy类getViewStub()获取的ViewStub实例可能返回空。
viewStub.inflate();
2.3、设置值
前面在data binding layout布局中bind:的值会自动传给ViewStub布局中
<ViewStub
android:id="@+id/view_stub"
android:layout="@layout/common_layout"
bind:nickName="@{name}" />
还有另外一种方法:给ViewStubProxy对象添加OnInflateListener监听器,当ViewStub加载的时候回调设置里面的值。
dataBindingBinding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener() {
@Override
public void onInflate(ViewStub stub, View inflated) {
CommonLayoutBinding commonLayoutBinding = DataBindingUtil.bind(inflated);
commonLayoutBinding.setNickName("Zhao");
}
});
参考资料:
ViewStubs
Data Binding:Generated binding classes