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

Импортировать xml в другой xml

В моем xml (a Button) я повторяю много контроля. Есть ли возможность записать Button один раз в xml, а затем импортировать его во весь макет, который мне нужен?

4b9b3361

Ответ 1

Вы можете использовать

<include  layout="@layout/commonlayout" android:id="@+id/id" />

commonlayout.xml должен быть определен в res/layout, где вы можете добавить повторяющиеся части.

Ответ 2

Как сказал Labeeb P, он работает. Просто хочу добавить, что вы также можете переопределить параметры:

<include  
        layout="@layout/commonlayout" 
        android:id="@+id/id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_marginLeft="2sp"
        android:layout_marginRight="2sp"
 />

Ответ 3

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

Часть <merge> разделяется, когда вы включаете ее в другой xml. Это может помочь включить более чем один Button за раз. См. Официальную документацию .

Ответ 4

Вы можете использовать тег include XML по умолчанию, чтобы включить внешний макет:

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

Этот макет должен иметь внешний ViewGroup, который инкапсулирует содержимое или тег merge, чтобы избежать необходимости использовать ненужный макет:

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

    <TextView android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_world" />

</LinearLayout>

<!-- OR -->

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

    <TextView android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_world" />

</merge>

Кроме того, если вам нужен лучший способ включения фрагментов макета, который действует как контейнер (пользовательский ViewGroup), вы можете использовать эту пользовательскую ViewGroup. Обратите внимание, что это не импортирует XML в другой файл XML, он раздувает содержимое из внешнего макета и заменяет его. Он похож на ViewStub, вроде "ViewGroupStub".

Этот lib действует так, как будто ViewStub может использоваться как следующий (отметить, что этот пример не работает! ViewStub не является подклассом ViewGroup!):

<ViewStub layout="@layout/somecontainerlayout" 
    inflate_inside="@+id/somecontainerid">

    <TextView android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_world" />

</ViewStub>