本文为《BlackBerry应用开发者指南 UI API篇之创建客户定制的UI组件》,本文依旧是介绍BlackBerry UI API篇,如何创建创建客户定制的UI组件。
创建客户定制的UI组件
你仅能将定制的上下文菜单项和布局增加到一个定制的 field 中。
创建定制的 field
为覆写 field 的缺省行为,创建一个定制的 field。
(注:不要使用 Screen 对象来输入文本。Screen 对象没有明确的实现此功能,它需要复杂的输入方法,例如国际化的键盘和 7100 系列的设备。为了实现不同输入方法的无缝集成,扩展 Field 或者其任一子类。)
DrawStyle 接口的实现允许在定制的 field 上绘制样式。
客户定制的 field 应该实现所有相关的系统样式。例如,USE_ALL_WIDTH 和 USE_ALL_HEIGHT适用于许多 field。
扩展 Field 类
扩展 Field 类和任一其子类,指定定制 Field 的特征。
定义按钮的标签,图形,以及样式
你的构造子的实现定义了按钮的标签,图形,以及样式。
指定 field 中对象的安排
任何扩展 Field 的类必须实现 layout().Field 管理器调用了 layout()方法来决定 field应该如何根据可用的控件安排它的内容。
定义需要的宽度
(注:在大多数情况下,通过覆写 getPreferredWidth(),确保合适的布局出现在定制的布局管理器里。)
getPreferredWidth()的实现计算出定制 Field 的宽度,这个定制 Field 是基于标签 Field的相对尺寸的。使用相对尺寸来确保标签不会超出标签的尺寸。
定义需要的高度
(注:在大多数情况下,通过覆写 getPreferredHeight(),确保合适的布局出现在定制的布局管理器里。)
getPreferredHeight()的实现计算出定制 Field 的高度,这个定制 Field 是基于标签 Field的相对尺寸的。它确保了标签不会超出 field 的尺寸。
定义定制 field 的外观
paint()的实现定义了 BlackBerry 设备屏幕上的定制 Field 的外观,不管什么时候 Field的域标记为无效,Field 管理器都调用 paint()来重绘 Field。
技巧:验证 paint()是否是有效率的,因为不管什么时候 field 发生变化,UI 框架调用 paint()方法。对于大数量的 field,使用 Graphics.getClippingRect()并在可见的区域里绘图来保存绘制时间。
处理焦点事件
为了支持焦点事件,使用 Field.FOCUSABLE 样式以及实现 Field.moveFocus().如果你想你的 Field 接收焦点,覆写 Field.isFocusable()返回 true。
当 Field 获得焦点时,UI 框架调用 onFocus(),当 Field 失去焦点时,调用 unFocus().如果你的 field 对于这些事件需要特定的行为,覆写这些方法。框架调用 moveFocus()来处理 field 的焦点移动事件。它对应 trackwheelRoll 事件,覆写 drawFocus( )。
实现 set和 get方法
Field 的 get 和 set 方法的实现,增加了 Field 的能力。
(注:所有 get 和 set 方法应该在 field 加入到一个 Screen 的前后工作。例如,如果现在屏幕上的 field 合适的调用了 invalidate()或 updateLayout()setLabel(),应该使用一个新值来修改其显示。)
代码实例
CustomButtonField.java 创建了具有多个图形的 button field。
#p#
创建定制的上下文菜单项
在 Field 类里,创建定制的上下文菜单项。
提供一个上下文菜单
在主应用程序类里,覆写 makeContextMenu()方法提供一个上下文菜单。
创建应用程序菜单
在主应用程序类里,覆写 makeMenu()方法创建应用程序菜单,并且无论合十,当特定的 field获取焦点时,更新上下文菜单。
代码实例
实例: ContextMenuSample.java
- /**
- * ContextMenuSample.java
- * Copyright (C) 2001-2005 Research In Motion Limited. All rights
- reserved.
- */
#p#
创建定制的布局管理器
Manager 对象管理 UI 组件的位置以及决定屏幕上的 field 如何安排。
创建一个定制的布局管理器
扩展 Manager 类或其任一子类
返回一个优先的 Field宽度
覆写 getPreferredWidth(),以致它能为管理器返回一个优先的 Field 宽度。
getPreferredWidth()的实现可以返回不同的值,取决于布局管理器的目的。例如,如果管理器扩展了 HorizontalFieldManager,getPreferredWidth()返回所有 field 宽度的总和。如果扩展了 VerticalFieldManager,getPreferredWidth()返回最宽 field 的宽度。
(注:TextField 和 Manger 使用了指派给他们的整个宽度。为组织 2 个或更多的水平上的对象,分别覆写它们各自的 getPreferredWidth()方法。为了组织多个水平上的TextField,覆写 layout().)
返回一个优先 Field 高度
覆写 getPreferredHeight(),以致它能为管理器返回一个优先的 Field 高度。
指定子 Field如何安排
subLayout()方法指定了管理器如何在屏幕上组织 field。它得到管理器中 field 的个数,然后为子 field 设置合适的位置以及布局。
layout() 调用了 subLayout() 方法,subLayout() 方法通过调用每个管理器包含的 field 的setPositionChild ()以及 LayoutChild(),控制每个子 field 如何加到屏幕上。
(注:为设置 field 需要的大小,在 subLayout()方法里调用 setExtend()。如果你不调用 setExtend(),则不会绘制每个 field,并且也不抛出一个异常。)
处理焦点
当用户滚动滑轮时,为了指定 field 该如何得到焦点,覆写 nextFocus()方法。direction 参数描述了焦点移动的方向(一般来说,当滑轮向下滚动,焦点向下并且向右方向。当滑轮向上滚动,焦点向上并且向左)。
为了将焦点转移到下一个 field,而以管理器的顺序,这个 field 不是下一个 field,那么覆写nextFocus().例如,如果你想为你的管理器实现 Page-up 和 Page-down 的功能,那么 nextFocus()就有用了。
当可见区域改变时重绘 field
缺省的,定制的管理器在不考虑剪辑区域下调用 paint()重绘所有 field。如果这导致了不必要的重绘,当可见区域改变时,仅 subpaint()的实现重绘所有 field。
代码实例
例: DiagonalManager.java
- /**
- * DiagonalManager.java
- * Copyright (C) 2001-2005 Research In Motion Limited. All rights
- reserved.
- */
- package
- com.rim.samples.docs.custommenu;
- import
- net.rim.device.api.system.*;
#p#
创建列表
一个 ListField 包含了多列可选项。为了使用户可以选择列表中多项,声明列表为MULTI_SELECT.
创建一个回调对象
ListFieldCallback 对象为列表控制所有重绘任务。每次要求 Field 显示列表中的一个条目。必要的方法也会在回调对象中调用。
ListFieldCallback 接口的实现创建了一个回调对象。系统调用这个接口的方法绘制列表的行,获得一个指定的列表元素,或决定列表的宽度。
允许 Field重绘一行
drawListRow()的实现允许 Field 重绘一行。传递到 drawListRow()的图形上下文代表整个列表。相应地,drawText()必须指明绘制哪一行。
允许 Field从列表中得到一个条目(Entry )
get()的实现允许 field 从列表中得到一个条目。本方法返回一个包含在有明确索引行中的对象。
为列表返回一个优先的宽度
getPreferredWidth()的实现为列表返回一个优先的宽度。在下面的实现中,getPreferredWidth()返回整个屏幕的绘制宽度。
getPreferredWidth()的实现返回一个不同的值,这依赖 field 管理器的类型。例如,如果管理器扩展了 HorizontalFieldManager,getPreferredWidth()返回所有 field 宽度的总和。如果扩展了 VerticalFieldManager,getPreferredWidth()返回最宽 field 的宽度。
指派回调以及加入条目到列表中
创建列表对象,并且将回调指派这个对象。
创建列表对象
为了列表创建 ListField 对象以及 ListCallback 对象。
(注:ListCallback 是一个定制的 ListFieldCallback 类,这个类在 66 页的“创建一个回调对象”中创建。)
设置回调
调用 setCallback()将 ListFieldCallback 与 ListField 关联。这个关联允许回调增加列表项到列表中。
增加列表条目
为了将条目增加到列表中,创建条目,并指定一个索引,并在这个索引上插入每个条目到ListField 对象中。然后每个 ListField 对象到 ListFieldCallback 中。
代码实例
例:SampleListFieldCallback.java
- /**
- * SampleListFieldCallback.java
- * Copyright (C) 2001-2005 Research In Motion Limited. All rights
- reserved.
- */
【编辑推荐】
- BlackBerry应用开发者指南 创建客户定制的UI组件
- BlackBerry应用开发者指南 UI API篇之管理UI组件
- BlackBerry应用开发者指南 UI API篇之显示UI组件
- BlackBerry应用开发者指南基础附录 .alx文件
- BlackBerry应用开发者指南 选项API