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元素了。
-
|