我只需要有人告诉我,我是否正确理解何时使用<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>
我是否理解正确?
答案 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
作为单个父元素,并且可以避免添加不必要的父元素。
如果要以不同的方式应用布局,请避免“合并”,而不是在文件中定义布局。