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