将xml导入到另一个xml中

我有很多控制重复在我的xml (例如一个Button )。 有没有可能在xml编写一次Button ,然后将其导入到我需要的所有布局中?

您可以使用

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

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

正如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> 

将其包含到其他xml中时, <merge>部分将被剥离。 这可能有助于一次包含多个Button 。 请参阅官方文档 。

您可以使用默认的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文件中,它会从外部布局中膨胀内容并将其replace到视图中。 它类似于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>