BlackBerry应用开发者指南 创建客户定制的UI组件

移动开发
本文依旧是介绍BlackBerry UI API篇,如何创建创建客户定制的UI组件。你仅能将定制的上下文菜单项和布局增加到一个定制的 field 中。

本文为《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

  1. /**  
  2. *  ContextMenuSample.java  
  3. *  Copyright  (C)  2001-2005  Research  In  Motion  Limited.  All  rights  
  4. reserved.  
  5. */ 

代码

代码

#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

  1. /**  
  2. *  DiagonalManager.java  
  3. *  Copyright  (C)  2001-2005  Research  In  Motion  Limited.  All  rights  
  4. reserved.  
  5. */ 
  6. package   
  7. com.rim.samples.docs.custommenu;  
  8. import   
  9. 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

  1. /**  
  2. *  SampleListFieldCallback.java  
  3. *  Copyright  (C)  2001-2005  Research  In  Motion  Limited.  All  rights  
  4. reserved.  
  5. */ 

【编辑推荐】

  1. BlackBerry应用开发者指南 创建客户定制的UI组件
  2. BlackBerry应用开发者指南 UI API篇之管理UI组件
  3. BlackBerry应用开发者指南 UI API篇之显示UI组件
  4. BlackBerry应用开发者指南基础附录 .alx文件
  5. BlackBerry应用开发者指南 选项API

 

责任编辑:佚名 来源: 网络整理
相关推荐

2011-04-14 10:05:16

BlackBerry

2011-04-14 10:03:32

UI组件BlackBerry

2011-04-13 11:31:06

PIM APIBlackBerry

2011-04-13 09:55:16

Mail APIBlackBerry

2011-04-13 13:38:57

选项APIBlackBerry

2011-04-02 13:44:08

2011-04-13 14:10:27

.alx文件BlackBerry

2011-04-15 16:05:00

监听UI对象的改变BlackBerry

2011-04-15 14:22:20

图片操作UIBlackBerry

2011-07-19 09:51:32

性能优化Designing FAndroid

2011-04-18 11:00:34

使用音频BlackBerry

2011-02-16 16:45:23

MWCRIMBlackBerry

2020-07-15 07:00:00

移动应用开发者指南

2009-03-24 08:51:30

YUIJavaJavascript

2022-01-02 06:59:43

SentrySDK 开发客户端报告

2011-04-26 10:19:46

BlackBerry

2024-02-01 09:37:42

Kubernetes服务网格• 命令

2024-05-07 08:45:16

OpenAILlamaIndex大语言模型

2023-11-26 00:17:21

2018-03-27 23:25:40

Paddle
点赞
收藏

51CTO技术栈公众号