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

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

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

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

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

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

 <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 за раз. См. Официальную документацию .

Вы можете использовать тег 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>