Могут ли некоторые уточнить использование <include>и <merge> - PullRequest
36 голосов
/ 08 февраля 2012

Мне просто нужно, чтобы кто-то сказал мне, правильно ли я понял, когда использовать <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 ]

26 голосов
/ 08 февраля 2012

Насколько я понимаю, элемент слияния будет установлен как более высокий элемент в иерархии представлений. Включить просто поместит туда всю группу просмотра. Итак, используя ваш пример, иерархия представления должна выглядеть так:

С объединением:

LinearLayout (root)
|
TextView

С включают:

LinearLayout (root)
|
LinearLayout
|
TextView

Таким образом, у вас будет дополнительный LinearLayout в иерархии представлений, который вам не нужен. Однако иногда вам нужен этот промежуточный вид. В вашем случае вы этого не сделаете, поскольку оба LinearLayouts имеют одинаковые параметры макета и никаких других отличий.

26 голосов
/ 08 февраля 2012

Да, вы правильно поняли.merge используется как псевдо родительский элемент для уменьшения количества уровней в деревьях представления.Просто проверьте эту ссылку , она дает очень хорошее объяснение 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 в качестве одного родительского элемента и можете избежать добавления ненужного родительского макета.

Просто избегайте слияния, если вы хотите применить макет иначе, чем макет, определенный в файле, в который входит ваш контент.

...