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

QuibblerQuibbler 2020-12-28 约 9 分钟 1851 次阅读

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

        

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w