databinding 中include、merge及viewstub的使用

为了减少视图层次的嵌套 节省性能开资  再布局中通常都使用到了include   merge   viewstub。最近我在项目中也使用了这几个标签,自己坐下总结,也共其他人参考。

ViewStub

在databinding 中,使用ViewStub, 本身他就是宽高为0的,节约了性能开支。我在xml中这样做的

<ViewStub
                        android:id="@+id/viewStub"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="20px"
                        android:layout="@layout/view_stub_template" />

布局文件  view_stub_template: 

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="taskDetail"
            type="com.miguan.library.yby.util.network.module.TemplateDetailModel" />
    </data>

    <com.zhy.autolayout.AutoRelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/iv_distinguish_content"
            android:layout_width="45px"
            android:layout_height="45px"
            android:src="@mipmap/iv_distinguish_content" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@id/iv_distinguish_content"
            android:layout_alignBottom="@id/iv_distinguish_content"
            android:layout_marginLeft="10px"
            android:layout_toRightOf="@id/iv_distinguish_content"
            android:gravity="center_vertical"
            android:text="待识别内容"
            android:textColor="@color/a323232"
            android:textSize="26px" />

        <EditText
            android:id="@+id/et_distinguish_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/iv_distinguish_content"
            android:layout_marginTop="10px"
            android:background="@color/f5f5f5"
            android:gravity="start"
            android:maxLines="4"
            android:minHeight="100px"
            android:padding="10px"
            android:textColor="@color/c8c8c8"
            android:textSize="26px"
            app:json="@{taskDetail.attributes}"
            tools:text="哈哈哈哈哈" />
    </com.zhy.autolayout.AutoRelativeLayout>
</layout>

这样开始的时候就不会先加载里面的布局,需要用到的时候在加载,我这里使用的inflate  通过binding

 View inflate = binding.viewStub.getViewStub().inflate();

注意inflate会有一个返回值  为view  这个view,在我们进行绑定数据的时候用到,就是替换掉viewstub布局的layout

ViewStubTemplateBinding viewStubBinding = DataBindingUtil.getBinding(inflate);
                                    viewStubBinding.setTaskDetail(detailModel);

include、merge

这两个就一起说了,include大家都不陌生,因为重复的布局文件,我们都用他来替代 ,而merge 是为了减少视图层级的嵌套

那么在databinding中怎么用的呢?

其实很简单

<include
                    android:id="@+id/layout_include"
                    layout="@layout/include_layout_publish_task" />
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <merge
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:parentTag="com.zhy.autolayout.AutoLinearLayout">

        <com.zhy.autolayout.AutoRelativeLayout
            android:id="@+id/all_tag"
            android:layout_width="match_parent"
            android:layout_height="90px"
            android:layout_below="@id/arl_attribute"
            android:layout_alignParentRight="true"
            android:layout_marginTop="20px"
            android:background="@color/white">

            <ImageView
                android:id="@+id/iv_tag"
                android:layout_width="44px"
                android:layout_height="44px"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:layout_marginLeft="14px"
                android:src="@mipmap/iv_task_tag" />

            <ImageView
                android:id="@+id/iv_tag_indicator"
                android:layout_width="26px"
                android:layout_height="26px"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="20px"
                android:src="@mipmap/edu_rigth_indicator"
                app:layout_auto_basewidth="height" />

            <TextView
                android:id="@+id/tv_tag_class"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="14px"
                android:layout_toRightOf="@id/iv_tag"
                android:gravity="center_vertical"
                android:text="任务标签:"
                android:textColor="#323232"
                android:textSize="26px" />

            <TextView
                android:id="@+id/tv_tags"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toLeftOf="@id/iv_tag"
                android:ellipsize="end"
                android:gravity="center_vertical"
                android:maxWidth="260px"
                android:maxLines="1"
                android:textColor="#8c8c8c"
                android:textSize="@dimen/px26"
                tools:text="小二班、中二班、大二班" />

        </com.zhy.autolayout.AutoRelativeLayout>

    </merge>
</layout>

说是merge必须是根节点标签,虽然我这么转换了,但是文件一直报错,但这并没有影响编译。具体我也不太懂,有兴趣的可以自己研究一下。

需要注意的是,这里要想调用merge标签的内容,或者说,用include引用的内容,一定要为include设置id,方可获取到布局内的控件

RxViewEvent.rxEvent(binding.layoutInclude.allTag, new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
                EduAssociateClassActivity.jumpEduAssociateActivity(AppHook.get().currentActivity(), EduAssociateClassActivity.CHOOSETYPE.multiple);
            }
        });

RxViewEvent这里不要考虑  重点是看binding.layoutInclude.allTag这样就能获取到include里面的控件id啦。

就到这里吧,希望对部分同学有帮助,我也是个菜鸟哦!!

 

发布了5 篇原创文章 · 获赞 0 · 访问量 366
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览