将xml导入另一个xml

时间:2010-11-09 09:54:44

标签: android xml

我在xml(例如Button)中重复了很多控制。是否有可能在Button中编写xml一次,然后在我需要的所有布局中导入它?

4 个答案:

答案 0 :(得分:101)

您可以使用

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

commonlayout.xml应在res/layout中定义,您可以在其中添加重复的部分。

答案 1 :(得分:22)

正如 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 :(得分: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。请参阅official documentation

答案 3 :(得分: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,&#34; ViewGroupStub&#34;等。

此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>