Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
В секции Custom можно увидеть компонент <include>. Если вы имели дело с PHP, то данный тег вам уже знаком. Он позволяет вставить заранее подготовленный кусок разметки в вашу разметку. Зачем это нужно? Представьте себе, что у вас сложное приложение, состоящее из нескольких активностей. И в каждой активности есть один и тот же одинаковый элемент, например, футер для отображения логотипа компании или текста. Чтобы не повторять одинаковый блок в каждой активности по отдельности, можно создать отдельную разметку и через include добавлять в нужное место.
Подготовим заранее нужную разметку и сохраним его в отдельном файле папки res/layout:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
style="?android:textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"
android:padding="16dp"
android:text="Коты - наше всё!"
android:textIsSelectable="true" />
</ScrollView>
Теперь возвращаемся к основной активности, где уже есть кнопки, метки и текстовое поле, и добавляем подготовленную разметку через include:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button" />
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
<include
android:layout_width="wrap_content"
android:layout_height="wrap_content"
layout="@layout/excerpt_content" />
</LinearLayout>
Как видите, вам нужно указать в атрибуте layout нужную разметку и его содержимое отобразится на экране активности. Подобный подход может существенно сэкономить ресурсы для сложной разметки.
Кстати, вы можете переопределять различные параметры источника, указывая свои значения для разных макетов.
Если вы выберете <include> в режиме дизайна, то появится диалоговое окно, в котором нужно выбрать созданный вами макет.
Тег <merge/> помогает устранить избыточную группировку, когда один шаблон включается в другой. Например, если ваш основной шаблон – вертикальный LinearLayout, в котором два последовательных компонента могут быть повторно использованы в различных других разметках, то повторно используемый шаблон, в котором вы размещаете два компонента, требует свой корневой элемент. Однако, использование другого LinearLayout как корневого элемента для повторно используемого Layout приведет к вертикальному LinearLayout внутри вертикального LinearLayout. Вложенный LinearLayout уменьшает производительность работы пользовательского интерфейса и не нужен для работы.
Чтобы избежать избыточной группировки элементов View, вы можете использовать <merge> как корневой элемент для повторного использования шаблона. Например:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<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"/>
</merge>
Теперь, когда вы подключает шаблон в другой с использованием тега <include/>, система игнорирует элемент <merge> и помещает две кнопки непосредственно в разметку на месте тега <include/>.