Тег включення
<include>
Тег дозволяє розділити ваш макет на кілька файлів: це допомагає справа з комплексним або занадто довгим призначеним для користувача інтерфейсом.
Припустимо, ви розділили свій складний макет за допомогою двох файлів, що включають:
top_level_activity.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<include layout="@layout/include1.xml" />
<!-- Second include file -->
<include layout="@layout/include2.xml" />
</LinearLayout>
Тоді потрібно написати include1.xml
і include2.xml
.
Майте на увазі, що xml з файлів include просто скидається у ваш top_level_activity
макет під час візуалізації (майже як #INCLUDE
макрос для C).
Файли, що включають, мають простий макет xnex xml.
include1.xml :
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
... і включати2.xml :
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button1"
android:text="Button" />
Подивитися? Нічого фантазійного. Зауважте, що ви все ще повинні оголосити простір імен для Android xmlns:android="http://schemas.android.com/apk/res/android
.
Отже виведена версія top_level_activity.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
У вашому коді Java все це прозоро: findViewById(R.id.textView1)
у вашому класі активності повертається правильний віджет (навіть якщо цей віджет був оголошений у файлі XML, відмінному від макета діяльності).
І вишня зверху: візуальний редактор обробляє річ плавно. Макет верхнього рівня відображається із додаванням xml.
Ділянка згущується
Оскільки файл включення - це класичний файл формату xml, це означає, що він повинен мати один верхній елемент. Тож у випадку, якщо ваш файл потребує декількох віджетів, вам доведеться використовувати макет.
Скажімо, у include1.xml
них зараз два TextView
: макет повинен бути оголошений. Давайте виберемо LinearLayout
.
include1.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
Top_level_activity.xml буде надана як:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<LinearLayout
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
Але зачекайте, що два рівні LinearLayout
є зайвими !
Дійсно, два які не вкладені LinearLayout
служать ніякої мети , як два TextView
можуть бути включені в layout1
протягом точно так же рендеринга .
То що ми можемо зробити?
Введіть тег злиття
<merge>
Тег просто фіктивний тег , який забезпечує верхній елемент для вирішення такого роду проблеми надмірності.
Тепер include1.xml стає:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</merge>
і тепер top_level_activity.xml відображається як:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
Ви зберегли один рівень ієрархії, уникайте одного марного вигляду: Ромен Гай вже спить краще.
Ви зараз не щасливіші?
<TextView />
, нічого іншого.