Можно ли уточнить использование <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>
Правильно ли я понял это?
Ответы
Ответ 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"/>
Теперь, когда вы включаете этот макет в другой макет (используя тег), система игнорирует элемент и помещает две кнопки непосредственно в макет вместо тега.