В моем xml
(a Button
) я повторяю много контроля. Есть ли возможность записать Button
один раз в xml
, а затем импортировать его во весь макет, который мне нужен?
Импортировать xml в другой xml
Ответ 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>