我在xml
(例如Button
)中重复了很多控制。是否有可能在Button
中编写xml
一次,然后在我需要的所有布局中导入它?
答案 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>