有些人可以澄清<include>和<merge> </merge> </include>的用法

时间:2012-02-08 15:40:23

标签: android android-layout merge include

我只需要有人告诉我,我是否正确理解何时使用<include>和何时<merge>

因此,我制作了一个标题布局,我希望将其包含在其他XML布局中:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
           <TextView
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"        
        android:text="Header text" />
</LinearLayout>

我以这种方式将其包含在其他XML中(这是非常基本的):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
               <include android:id="@+id/header" layout="@layout/top"
             android:layout_width="fill_parent" android:layout_height="wrap_content"
            />
</LinearLayout>

这将运作良好,没有任何问题。但是为了优化代码,我必须在包含的布局中使用<merge>。因此top layout不应该有标记<LinearLayout>,但它必须如下所示:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
     <TextView
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"        
            android:text="Header text" />
</merge>

我是否理解正确?

2 个答案:

答案 0 :(得分:25)

根据我的理解,它会将merge元素设置为视图层次结构中的更高元素。包含将简单地将整个视图组放在那里。因此,使用您的示例,视图层次结构应如下所示:

合并:

LinearLayout (root)
|
TextView

使用include:

LinearLayout (root)
|
LinearLayout
|
TextView

因此,在视图层次结构中,您将不需要额外的LinearLayout。但是,有时您需要该中间视图。在你的情况下,你不会,因为两个LinearLayouts都有相同的布局参数,没有其他差异。

答案 1 :(得分:24)

是的,你理解正确。 merge用作伪父元素,以减少视图树中的级别数。 只需查看此link,就merge提供了非常好的解释 在头文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
               <include android:id="@+id/header" layout="@layout/top"
             android:layout_width="fill_parent" android:layout_height="wrap_content"
            />
</LinearLayout>   
当您的文件包含在您提到的其他文件中时,

<LinearLayout>没有任何区别。因此,使用merge代替是一件好事 因为在XML中你必须使用单个父元素,其余的XML元素应该包含在其中,你应该使用merge作为单个父元素,并且可以避免添加不必要的父元素。
如果要以不同的方式应用布局,请避免“合并”,而不是在文件中定义布局。