2010-11-09 6 views
40

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

+0

я столкнулся этот вопрос, когда я был собирается сделать верхний бар, который выглядит как навигационная панель iOS. –

ответ

93

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

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

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

+0

работы. Большое спасибо – Blackbelt

+0

Короткий, но удивительный ответ. –

19

Как 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" 
/> 
2

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

0

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