【Jetpack】DataBinding(四):布局include和ViewStub

Quibbler 2020-12-28 655

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一次,所以上面通过ViewStubProxygetViewStub()获取的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

        

不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com