美文网首页
Andorid布局优化-include与merge

Andorid布局优化-include与merge

作者: HelloLeol | 来源:发表于2021-04-14 00:29 被阅读0次

    include

    include不多做介绍。主要是可以方便快速复用布局。

    1. include标签的layout_*属性会替换掉被include视图的根节点的对应属性。
    2. include标签的id属性会替换掉被include视图的根节点id

    但是通过include会引入一个问题。具体代码如下:

    主布局
    <RelativeLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <include layout="@layout/merge_test"/>
    
    </RelativeLayout>
    
    merge_test.xml布局
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_gravity="center_horizontal"
            android:text="这是第一个"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_gravity="center_horizontal"
            android:text="这是第二个"/>
    </RelativeLayout>
    

    代码的例子很简单,通过一个xml文件定义了两个左右排列的TextView。

    最后文件被一个主布局通过include引入界面。

    出现的问题就是这样会多重复嵌套了一层RelativeLayout。如下

    多余.png

    为了解决这个问题,google提供了一个与include配套的标签merge,稍作修改如下

    merge_test.xml
    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_gravity="center_horizontal"
            android:text="这是第一个"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_gravity="center_horizontal"
            android:text="这是第二个"/>
    </merge>
    

    修改以后运行,界面上不会有任何修改,但是整体结构上却变成了一层RelativeLayout如下:

    merge.png

    下面是一些常用的<merge>标签的注意事项和小技巧

    1.merge必须放在布局文件的根节点上。
    2.merge并不是一个ViewGroup,也不是一个View,它相当于声明了一些视图,等待被添加。
    3.merge标签被添加到A容器下,那么merge下的所有视图将被添加到A容器下。
    4.因为merge标签并不是View,所以在通过LayoutInflate.inflate方法渲染的时候, 第二个参数必须指定一个父容器,且第三个参数必须为true,也就是必须为merge下的视图指定一个父亲节点。
    5.如果Activity的布局文件根节点是FrameLayout,可以替换为merge标签,这样,执行setContentView之后,会减少一层FrameLayout节点。
    6.自定义View如果继承LinearLayout,建议让自定义View的布局文件根节点设置成merge,这样能少一层结点。
    7.因为merge不是View,所以对merge标签设置的所有属性都是无效的。

    相关文章

      网友评论

          本文标题:Andorid布局优化-include与merge

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