Подтвердить что ты не робот

Можно ли уточнить использование <include> и <merge>

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

Правильно ли я понял это?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Слияние:

LinearLayout (root)
|
TextView

Включить:

LinearLayout (root)
|
LinearLayout
|
TextView

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

Ответ 3

Тег <merge /> помогает исключить избыточные группы представлений в вашей иерархии представлений при включении одного макета в другой. Например, если ваш основной макет - это вертикальный LinearLayout, в котором два последовательных представления могут быть повторно использованы в нескольких макетах, то повторно используемый формат, в который вы помещаете два представления, требует своего собственного корневого представления. Однако использование другого LinearLayout в качестве корня для повторно используемого макета приведет к вертикальному LinearLayout внутри вертикального LinearLayout. Вложенный LinearLayout не служит никакой реальной цели, кроме замедления производительности пользовательского интерфейса.

Чтобы избежать включения такой избыточной группы представлений, вместо этого вы можете использовать элемент <merge> в качестве корневого представления для повторно используемого макета. Например:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/add"/>

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/delete"/>

Теперь, когда вы включаете этот макет в другой макет (используя тег), система игнорирует элемент и помещает две кнопки непосредственно в макет вместо тега.