美文网首页
1.merge标签与LayoutInflater.inflate

1.merge标签与LayoutInflater.inflate

作者: crossroads | 来源:发表于2017-03-06 18:06 被阅读335次

    前言

    根据启舰大大 的博客所学习的滑动删除。

    一、merge标签:减少冗余的层次从而达到优化UI的目的

    <merge/>只能作为XML布局的根标签使用
    当Inflate以< merge />开头的布局文件时,必须指定一个父ViewGroup,并且必须设定attachToRoot为true。 必须为TRUE,是因为MERGE标签里没有可用的根结点

    section.xml

    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="你好"/>
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="HELLO "/>
    </merge>
    

    这个直接预览的页面是这样的


    预览图

    将此页面引用:

     <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
    >
        <include  layout="@layout/section"/>
    </LinearLayout>
    

    得到的页面是这样子的:

    效果图
    由此,可以看出merge标签能够将该标签中的所有控件直接连在上一级布局上面,从而减少布局层级,也就是说会直接将<merge />内的元素添加到<merge />的父元素里
    相当于这样子:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
    >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="你好"/>
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="HELLO "/>
    </LinearLayout>
    

    二、LayoutInflater.inflate()

    public View inflate(int resource, ViewGroup root, boolean attachToRoot)  
    
    • resource: 要将xml转化为view的layout布局
    • root: 根结点,作用主要取决于第三个参数
    • attachToRoot: 是否将转换后的VIEW直接添加到根结点上。
      如果是true,那么在转换出来VIEW之后,内部直接回调用root.addView()将其添加到root结点上,然后返回我们传进去的根结点root;
      如果设为false,那么只会将XML布局转换成对应的VIEW,不会将其添加在我们传进去的root结点上,这时,root结点的作用就是在从XML转换布局时,给它提供上层控件的layot_width、layout_height等布局参数,供它产生视图时计算长宽高的位置,由于新产生的视图不依附于root,所以就整个VIEW而言,根结点就是它自己,所以返回值就是XML产生的VIEW本身,注意,设为false这个VIEW是没有被添加进根结点中的。
    • 返回值:我们第一个先看返回的VIEW的意义,返回的VIEW指向的根结点
       View inflate = getLayoutInflater().inflate(R.layout.section, root, false);
            root.addView(inflate);
    

    等价于

    getLayoutInflater().inflate(R.layout.section, root, true);
    

    相关文章

      网友评论

          本文标题:1.merge标签与LayoutInflater.inflate

          本文链接:https://www.haomeiwen.com/subject/hfjugttx.html