当你为 BlackBerry 设备编写应用程序时,使用下面 2 组 UI API 的一组:
◆MIDP UI API (javax.microedition.lcdui 包)
◆BlackBerry UIAPI (net.rim.device.api.ui 包)
如果你正在编写一个在任何 MIDP 兼容设备上运行的应用程序,请使用 MIDP UIAPI.如果你正在编写专门运行在 BlackBerry 设备上的应用程序,那就使用 BlackBerry UI API 吧。BlackBerry API 提供了访问 BlackBerry 设备的特定特性的功能,并且也允许更成熟的 UI 布局(layout)和交互。
(注:不要在同一个程序里既使用 MIDP UI API,又使用 BlackBerry UI API,否则会抛出
异常。在应用程序中,UI 框架支持一中类型的 UI 对象。)
显示UI组件
显示屏幕(Screen)
UI 的主要结构是 Screen。一个应用程序一次只能显示一个屏幕。
(注:不要使用 Screen 对象来输入文本。Screen 对象没有明确实现此功能,它需要复杂的输入方法,例如国际化的键盘和 7100 系列的设备。为实现无缝得集成不同输入方法,扩展Field 或者其任一子类。)
显示栈(Stack)
Screen 对象在一个一组有序的 Screen 显示栈里得到维护。在栈顶的 Screen 对象是显示给用户的活动 Screen。当应用程序显示一个 Screen 时,它将这个 Screen 压入到栈顶。当关闭一个 Screen,将这个 Screen 从栈里移出,然后显示栈里的下一个 Screen,如果必要会重绘它。
(注:每个 Screen 在栈里只出现一次。如果同一个 Screen 压入到栈不止一次,VM 会抛出一个运行时异常。当用户完成和 Screen 交互,应用程序必须将 Screen 从栈里移出,以致内存不必再用。不要在同一时间里使用多个 Screen,因为每个 Screen 使用独立的线程。)
Screen的类型
在多数情况下,创建一个 Screen 最有效的方法是创建一个扩展 Screen 或其任一子类,FullScreen 或 MainScreen 的类。
响应用户交互
BlackBerry API 提供一个和 Java 标准版本类似的事件监听框架。特殊的,2 个监听接口使程序接收和响应用户交互:TrackWheelListener 和 KeyboardListnener。Screen 类和其子类都实现了这些方法。
提供 screen导航(navigation)
BlackBerry 应用程序为用户提供一个菜单来完成操作。避免使用按钮(Button)或其他占据Screen 空间的 UI 组件。
(注:按滑轮访问菜单。)
当创建一个FullScreen或Screen,在构造子里指明 DEFAULT_MENU 和DEFAULT_CLOSE 参数来提供缺省的导航。
FullScreen fullScreen = new FullScreen(DEFAULT_MENU | DEFAULT_CLOSE);
当创建一个 MainScreen 时,缺省的导航会自动提供。
增加菜单项
创建 MenuItem 对象。
MenuItem 构造子接受下面的 3 个参数:
run()定义了当用户点击菜单项发生的操作的实现。如果你没有使用本地资源,重写toString()方法来指定菜单项的名字。
为了在应用程序加入上下文菜单给 field,调用 getLeafFieldWithFocus(),并且调用 getContextMenu(),其返回值决定哪一个 Field 接收 makeMenu()里的客户化菜单项。
当增加你自己的菜单项时,显式的定义一个 Close 菜单项。
为了增加菜单项到 Screen 里,重写 Screen.makeMenu()方法:
如果你扩展Screen或其任一子类,那么当用户点击滑轮时,缺省的TrackwheelListener 实现调用 makeMenu( )。
如果你没有扩展 Screen,那么实现 TrackwheelListener。特殊地,trackwheelClick()的实现创建一个新的菜单,增加菜单项以及在 Screen 上显示菜单。
(注:为了创建菜单项提供附加的功能,请扩展 MenuItem 类。)#p#
显示对话框
PopupScreen 类通过使用它的子类,Dialog 和 Status,来提供创建对话框和状态 Screen的特性。Popup screen 不会压入到显示栈中,为了显示一个 popup screen,调用Dialog.ask(int)或 Status.show().
为了控制对话框的布局,使用 DialogFieldManager 对象。
为了显示一个对话框,使用下面的一个参数来调用 Dialog.ask():
为了指定一个对话框的缺省的响应,使用一个接受 defaultChoice 作为参数的Dialog.ask()版本。
显示状态消息
调用 Status.Show()显示一个状态消息。缺省的,状态屏幕保留其屏幕 2 秒钟。
- Status.show("Status screen message");
参看 API 参考获取 Status.Show()的版本信息,它使你可以指定额外的参数,例如不同的图标或者保持状态对话框可见的时间长短。你可以创建模态的状态对话框(需要用户取消它们),也可以创建计时的状态对话框(在指定的时间后自动取消)。#p#
显示域(Field)
所有 UI 组件以包含在管理器里的成矩形的 field 的形式表现。Field 的大小取决于它的布局需求。管理器为它们包含的 field 提供滚动(条)。
BlackBerry JDE 在 net.rim.device.api.ui.component 包里提供一个预创建接口控件和组件的库。多数情况下,你可以使用这些对象构建 UI 应用程序。
为了创建指定的 field 控件(如包含多个元素的文本 field),扩展 Field 类或者其任意子类来创建你自己定制的类型。
(注:参看 API 参考获取更多关于指定 field 类的有效、支持的格式的信息。如果使用一个不支持的格式实例化一个 Field,将抛出一个 IllegalArgumentException 异常。)
Bitmap Field
一个 BitmapField 包含了位图。当使用 Graphics 对象绘图时使用 BitmapField。为了修改一个 field 的内容,调用 BitmapField 的绘图方法。
有 4 种预定义的位图:
◆ Bitmap.INFORMATION
◆ Bitmap.QUESTION
◆ Bitmap.EXCLAMATION
◆ Bitmap.HOURGLASS
为了使用原始的.gif 或.png 作为位图,调用 getBitmapResource().
(注:一个二进制资源的大小,如一个.png 文件,不能超过 63,000 字节。)
Button Field
ButtonField 包含了用户选择来完成操作的按钮。使用 ButtonField 可以创建超出菜单的扩展交互的界面。
(插代码图8)
为了给 button 增加功能,扩展 ButtonField 并且覆写 trackwheelClick()方法,以让它能完成一个操作来代替调用菜单。当用户点击 button 后为了接受消息,使用一个FieldChangeListener 对象。
Choice field
Choice field 类似于下拉列表。这里有 2 种 choice field:包含整数的和包含可以转化为字符串的对象。
你也可以显示一组选项作为 check box 或者 radio button。
为了从 ChoiceField 里选择一个值,用户可以完成下面的操作:
◆点击 field,并且按 Space 键。
◆按住 Alt 键,滚动滑轮。
◆打开菜单,选择 Change Option。
OptionField 允许用户从列表种选择条目。为允许用户从选择列表中选择多个条目,使用 CheckBoxField 。为允许用户从选择列表中仅选择一个条目,使用RadioButtonField。
Date Field
在你的应用程序中,一个 DateField 显示当前的日期和时间。
当创建一个 DateField 时,调用 System.currentTimeMillis()得到当前时间。
Date Field 缺省为可编辑的。为了创建一个用户不能编辑的 Date Field,在其构造子中指定 Field.READONLY 参数。
将为可编辑的 Date Field 提供一个缺省的 Change Options菜单项。
Edit Field
一个EditField允许用户在此Field里输入文本。AutoTextEditField,EditField,和PasswordEditField都扩展了 BasicEditField.
(注:net.rim.device.api.ui.component.TextField 类,扩展了 Field 类,并且是抽象的。实例化它的子类,例如 RichTextField 或 EditField,就是创建一个显示文本或允许用户输入文本的UI Field。)
你可以应用下面的过滤项(filter)到 Edit Field 中。
Gauge Field
Gauge 允许你创建数值的可视表现。GaugeField 显示一个进度条或允许用户选择数字。你可以使用一个 Label 作为它的前缀,并显示 gauge 的当前值。例如,组合一个 GaugeField 和一个 NumericChoiceField 来创建一个用户制作的数字选择的图形化表现。
为了创建一个交互的 GaugeField,使用 Field.FOCUSABLE 和 Field.EDITABLE 样式实例化field。
Label (标签)和 Separator (分隔)Field
一个 LabelField 允许你增加文本标签到屏幕中。LabelField 是可读的。缺省的,它不能获得焦点。大部分应用程序在它们的***个屏幕上使用 LabelField 来显示一个静态的标题。
一个 SeparatorField 是一个静态的水平线,它跨越屏幕的宽度。使用 SeparatorField将屏幕上的相关内容和菜单分组。
MainScreen 缺省的在标题后显示一个分割线。
List Field
List 允许你创建子项的目录,通过此用户可以滚动并选择单个或多个条目。BlackBerry地址簿就是 List 对象的一个例子。
你不可以直接将内容加入到 field 条目中。你的 ListField 的 ListFieldCallback和 TreeField 的 TreeFieldCallback 的实现会绘图 field。
Tree Field
TreeField 包含父节点和子节点,并且显示一个折叠夹或它们(例如文档或信息折叠夹)之间的树关系。所有节点都是缺省可见的。为了指明一个折叠夹是否可以折叠,调用TreeField 对象的 setExpand()方法。
图标显示在包含有子节点的每个节点边上以明确节点是打开的还是折叠的。
TreeFieldCallback 的实现加入 field 到树中。
【编辑推荐】