У меня есть много контроля, повторяющегося в моем xml
(например, Button
). Есть ли возможность написать Button
один раз в xml
, а затем импортировать его во все макеты, в которых я нуждаюсь?импорт xml в другой xml
ответ
Вы можете использовать
<include layout="@layout/commonlayout" android:id="@+id/id" />
commonlayout.xml
должны быть определены в res/layout
, где вы можете добавить повторяющиеся части.
работы. Большое спасибо – Blackbelt
Короткий, но удивительный ответ. –
Как 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"
/>
В дополнение к этим большие ответы, вы можете также избежать дублирования кода, используя <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
за раз. См. official documentation.
Вы можете использовать по умолчанию 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
), вы можете использовать этот custom ViewGroup. Обратите внимание, что это не импортирует XML в другой файл XML, он раздувает содержимое из внешнего макета и заменяет его. Он похож на ViewStub
, вроде «ViewGroupStub».
этой библиотеки действует как если 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>
я столкнулся этот вопрос, когда я был собирается сделать верхний бар, который выглядит как навигационная панель iOS. –