Android平台提供了广泛的UI可视组件---widget,把这些小的可视的构件组合到一起,就可以给用户提供复杂而有用的界面。但是,应用程序经常需要一些高级可视组件,要满足这样的需求,并要达到高效的目的,可以把一些标准的widget组合成一个新的可复用的组件。
例如,包含一个进度条和一个取消按钮的操作进度表示组件;包含两个按钮的面板(取消和确认操作);带有一个图标、标题和说明的面板等等。通过编写定制的View类能够很容易的创建UI组件,但是使用XML会更加容易。
在Android XML布局文件中,每个标签都对应于一个实际的类实例(这个类始终是View类的子类),Android的UI工具集中还有三个特殊的标签,它们没有对应的View实例:<requestFocus />、<merge />和<include />。本文展示如何使用<include />标签来创建纯粹的XML可视组件。有关如何使用<merge />的信息,请看“合并布局”的文章,它跟<include />
组合起来使用,功能会更强大。
顾名思义,<include />标签是要在当前布局中包含另一个XML布局。这个标签的使用就像下例显示的那样简单,例子中直接引用了Android的Home应用程序的源代码:
<com.android.launcher.Workspace
android:id="@+id/workspace"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
launcher:defaultScreen="1">
<includeandroid:id="@+id/cell1"layout="@layout/workspace_screen"/>
<includeandroid:id="@+id/cell2"layout="@layout/workspace_screen"/>
<includeandroid:id="@+id/cell3"layout="@layout/workspace_screen"/>
</com.android.launcher.Workspace>
在<include />中只有layout属性是必须的。这个属性的值不带有android命名空间的前缀,它是希望要包含的布局文件的引用。在例子中,相同的布局被包含了三次。这个标签还能够覆盖一些被包含布局的属性。上例中的android:id指定了被包含布局的根View的id;如果定义了一个新的id,那么被包含布局的这个id也会被覆盖。类似的,可以覆盖所有的布局参数。就意味着任何android:layout_*属性都可以在<include />标签中使用。以下示例中,相同的布局被包含了两次,但只有第一次覆盖了布局属性:
<!-- override the layout height and width -->
<includelayout="@layout/image_holder"
android:layout_height="fill_parent"
android:layout_width="fill_parent"/>
<!-- do not override layout dimensions; inherit them from image_holder -->
<includelayout="@layout/image_holder"/>
警告:如果要覆盖布局的尺寸,就必须同时覆盖android:layout_height和android:layout_width属性---不能只覆盖高度或只覆盖宽度。如果只覆盖其中一个,不会有任何效果。没有覆盖的属性,依然会继承源布局中的属性设置。
在需要根据设备的配置来定制UI部分时,这个标记时特别有用的。例如,Activity的主布局可以被放到layout/目录中,然后包含保存在layout-land/和layout-port/目录中的另外布局,这样就可以在横屏和纵屏的布局中共享大多数的UI元素了。