Простий приклад використання <merge> та <include> у XML-макетах Android


76

Мені цікаво про теги <merge>and і <include>в XML-макетах Android. Я прочитав два підручники, але ще не знайшов простого прикладу використання.

Був би радий, якби хтось міг навести такий приклад або навести на нього вказівник.


2
Будь ласка, подивіться на офіційну документацію для Android: Повторне використання макетів з <include />
JJD

stackoverflow.com/a/11093340/596555 , може бути допомога u.
кип'ячена вода

FYI, якщо ви хочете використовувати це з меню , вам не пощастило, але ви можете надути кілька XML-файлів, як описано тут: stackoverflow.com/questions/4337034/…
Джошуа Пінтер,

Відповіді:


98

some_activity.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">

    // some views

    <include layout="@layout/view_part"/>

   // probably more views

</LinearLayout>

view_part.xml :

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    // the views to be merged

</merge>

отже, злиття-річ називається його ім'ям файлу ... немає атрибута id у файлі злиття?
aioobe

19
@aioobe правильно. <include>в основному означає "візьміть цей файл і вставте його вміст сюди".
янченко

привіт, насправді я зіткнувся з серйозною проблемою тут. Я використовую уподобання та вказую макети для використання всередині уподобань. Усередині макета я використовую функцію включення-злиття (так що у мене є власник місця, який буде використовувати перемикач або прапорець залежно від версії). Проблема полягає в методі onPostCreate моєї преференції, коли я намагаюся знайти подання (тобто прапорець / перемикач), я завжди отримую вигляд як нульовий! Чи можете ви допомогти тут? stackoverflow.com/questions/15708599/…
Адітія

3
Хоча прийнята відповідь є правильною, я виявив, що стаття тут: http://mfarhan133.wordpress.com/2010/10/01/reusing-layout-include-merge-tag-for-androd/ допомогла мені краще її візуалізувати. Сподіваюся, це комусь допомагає.
Уейн Фіппс,

Чи можливо це зробити з декларацією меню XML?
Джошуа Пінтер

7

Візьмемо приклад:

У мене є два теги <EditText>та <ListView >декілька інтерфейсів. Тож я створив файл XML, як вказано нижче, для включення у всі подібні інтерфейси.

<?xml ...>
<EditText ... />
<ListView ... />   

Наведений вище XML не є дійсним XML, оскільки він не мав кореневого елемента. Отже, кореневий елемент потрібен лише заради XML. <merge>є рішенням, наведеним нижче:

<?xml ...>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <EditText ... />
    <ListView ... />
</merge>

Thx за ваше корисне пояснення :)
Shamshirsaz.Navid


3

<merge>тег використовується для зменшення кількості рівнів для підвищення продуктивності макетів візуалізації. тег використовується з <include>тегом ідеально разом.

Візьмемо приклад, у нас є макет для входу в систему, який використовується для кількох обсягів нашої програми. Використовуючи тег для відображення login_layout, ми можемо використовувати і перейти рівень.

Також раджу прочитати хитрощі щодо макетів. http://android-developers.blogspot.com.tr/2009/03/android-layout-tricks-3-optimize-by.html

login_form.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Login form -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <EditText
        android:id="@+id/email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Email..."
        android:inputType="textEmailAddress"
        android:maxLines="1"
        android:singleLine="true"
        android:visibility="visible" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Password.."
        android:imeActionId="@+id/login"
        android:imeOptions="actionUnspecified"
        android:inputType="textPassword"
        android:maxLines="1"
        android:singleLine="true"
        android:text="1337"
        android:visibility="visible" />

    <Button
        android:id="@+id/sign_in_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="16sp"
        android:paddingLeft="32sp"
        android:paddingRight="32sp"
        android:text="Login"
        android:visibility="visible" />

</LinearLayout>

example_layout.xml (будь-який макет, який ми хочемо включити login_form.xml)

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" >

    <include layout="@layout/login_form" />

</merge>

Ми можемо побачити ієрархію рівнів введіть тут опис зображення


А як щодо посвідчень?
Yousha Aleayoub

2

id не вставляє код, інакше відносні параметри макета працювали б. Це робить різну обробку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.