android merge标签

通过merge标签可以优化Android XML布局文件,减少多余的view节点,从而加快页面解析速度,避免卡顿。merge标签适用于xml布局的根元素,并需要在inflate时指定ViewGroup并设置attachToRoot为true。文章通过实例展示了如何使用merge优化布局,特别是在一个布局文件被另一布局引用,两者尺寸、属性相同时,可以使用merge进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在写android xml布局文件时,有时候会产生多余的view树节点,当android进行解析时,多余的view节点会导致解析时间加长,进而导致

页面跳转变慢,变的卡顿。怎样避免这种情况呢?我们可以通过hierarchyviewer去查看布局文件的view 节点树,根据这个节点树利用merge

标签优化掉多余的节点。下面我们就使用一个例子来掩饰怎样使用merge标签来优化布局文件。

首先我们来说一下merge的特点:

1、merge标签只能用于xml layout文件的根元素

2、如果将一个以merge标签为根元素的xml文件作为布局文件的话,那么需要使用inflate (int resource, ViewGroup root, boolean attachToRoot)

指定一个ViewGroup 作为其容器,并且要设置attachToRoot 为true。

好了我们以两个不同的布局文件来对比使用merge标签后,view树的变化。例子是这样的:我自定义了一个view,然后定义了这个view的布局文

件,然后在Activity的布局中引用这个view,我们就使用merge来优化这个view的布局文件。

view的布局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" >
       
    <Button
        android:id="@+id/send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"    
        android:layout_marginLeft="10dp"
        android:text="发送"/>
	
    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/send"
        android:layout_centerVertical="true" 
        android:layout_marginLeft="10dp"
        android:layout_marginRight="20dp"
        android:ems="10">   
        <requestFocus
            android:focusable="true"/>
    </EditText>
</RelativeLayout>

activity的xml布局文件

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:auto="http://schemas.android.com/apk/res/com.lonuery.autowidget"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView 
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:textSize="25sp"
        android:text="地方"/>
   
	<com.lonuery.autowidget.AutoView
	    android:id="@+id/auto"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_centerHorizontal="true"
	    android:layout_below="@+id/tv"
	    android:layout_marginTop="15dp"
	    auto:attr1="发送"
	    auto:attr2="自定义属性">
	    
	</com.lonuery.autowidget.AutoView>
</RelativeLayout>

然后我们使用hierarchyviewer来查看这个activity的xml布局节点


根据这个图片我们可以看到,中间有一个RelativiLayout无效的节点,它是AutoView的唯一子元素,既然是唯一子元素那么他和父元素就有相同的尺寸

并且也没有定义background,以及padding和gravity,那么完全可以直接将这个节点去掉。

使用merge优化AutoView布局文件,使用merge标签替换RelativeLayout

<?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" >
       
    <Button
        android:id="@+id/send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"    
        android:layout_marginLeft="10dp"
        android:text="发送"/>
	
    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/send"
        android:layout_centerVertical="true" 
        android:layout_marginLeft="10dp"
        android:layout_marginRight="20dp"
        android:ems="10">   
        <requestFocus
            android:focusable="true"/>
    </EditText>
</merge>

然后我们再来看activity的布局节点图


我们可以看见:中间那个RelativeLayout的节点消失了,这样就优化了一个view节点,在android进行xml解析时就会少解析一个节点,这样就达到了

优化布局的目的。

通过以上例子我们了解到了merge标签的使用,那么merge标签在什么时候可以去使用呢?

当一个xml布局文件在另一个布局下被引用时,如果这两个布局相同,并且这个xml文件的大小尺寸和其父布局文件相同,也就是这个布局文件没有设置

background,gravity以及padding等属性时,就能够使用merge标签进行优化。简单的说就是:当一个xml布局文件A,然后在另一个xmlB中被引用,假

设A被放置在RelativeLayout中,那么只要A的根布局是RelativeLayout布局,并且符合上述条件,那么布局文件A的根布局RelativeLayout就能够使用merge

标签进行优化。如上述例子就是在Activity引入了自定义控件AutoView,那么就要在activity的布局文件中引入AutoView的布局,由于AutoView的布局的父

布局是RelativeLayout,那么在AutoView布局文件中就能够使用merge进行优化。

参考博客:http://www.cnblogs.com/xirihanlin/archive/2010/04/23/1718353.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值