作者: 杨江
3.5 最终的运 行结果 如图
你可以看 到屏幕 中间列 表显 示的三条 待审批 的记录 ,用 户打算通 过菜单 对审批 记录 进行操作 。
4 为从窗口添加显示和输 入字段 ;使用布局 管理器处理 U I 布局,背 景
色
4.1 从窗口 用户界 面的划 分 从程序设计 的角度 ,从窗 口被分割 为两个 重要的 部分: 申请编 辑区域 ,按钮 区域 。另外还 有标题 区域,分 割横线 。
|-------------------------- |
| 标题 |
|-------------------------- |
| 多个输入 域 | < --------- 编辑区域 , displayMessa ge( ) 方法
|--------- 分割横线 - -- -------|
| 同意 返 回 | < --------- 按钮区域 , displayButto n() 方法
|-------------------------- |
4.2 构造方法
编辑区域 包括两 个输入 域 EditField ,一个 可以 多行录入 的 文本 输入域 Te x tF ie ld ,一个时 间输入域 DateField 。按 钮区域包 括两个 按钮, 并排 排列。
public class MessageViewScreen extends MainScreen { MessagesListField _list;
Message _message;
boolean _editable;
final static int MAX_CHARS = 128; EditField senderField;
EditField subjectField; TextField contentField; DateField dateField;
ButtonField newButton; ButtonField agreeButton; ButtonField returnButton;
// 父窗口的 数据通 过参 数 list 和 message 传递 过来,并 且通过 editable 参 数告知 这个窗 口是用来 显示数 据,还 是 用来编辑 数据的 。
public MessageViewScreen(MessagesListField list, Message message, boolean editable) {
_list = list;
_message = message;
_editable = editable;
displayMessage();
add(new SeparatorField());
displayButton();
4.3 编辑区域 cod in g
在 d is p lay Me s s age () 方 法中 ,以可修 改或者 只读的 样式 (s ty le) 在窗口 中添加 各种输 入字段。 在屏幕
(Sc re e n ) 上 面添加 输入字 段 (F ie ld ) 是一 件很容 易的事 情, 只需要调 用 add ( 字段 ) 方法 就可以了 。 但是 客户新要 求设置 所有输 入字 段的背景 颜色为 淡蓝色。一 种常用的 方法是 使用 V e rtica lFie ld Man age r
布局管理 器类, 在布局 管理 器中设置 背景色 ,然后 调用 m an ager.add (f i e ld ) 把 相应输 入字段 放 进这个 布局管理 器里面 。
protected void displayMessage(){
VerticalFieldManager manager;
manager = (VerticalFieldManager)getMainManager();
Background bg = BackgroundFactory.createSolidBackground(Color.LIGHTBLUE);
manager.setBackground(bg);
long style;
style = EditField.READONLY;
if (_editable) style = EditField.EDITABLE;
senderField = new EditField(" 提交人 : ", _message .getSender(), MAX_CHARS, style);
manager.add(senderField);
// 其他类似 代码从 略
。。。
dateField = new DateField(" 提交日期 : ", (new Da te()).getTime(),DateFormat.DATE_MEDIUM);
manager.add(dateField);
// 其他类似 代码从 略
。。。
}
4.3 命令 按钮区域 cod in g
在 d is p lay Butt on () 方法中, 添加两个 命令按 钮,这 两个 命令按钮 按照布 局管理 器 Fo oterMan ager 的 处理被横 着摆放 ,中间 有一 定的间隔 ;两个命 令按 钮和 事件处理 类 Fie ld Chan ge Li s te n e r 关联, 以处 理用户点 击按钮 的事件 ,进 而审批通 过或者是 直接 返回 上级父窗 口。
protected void displayButton() {
//------------------------------------------------------------------
// 创建按钮 点击 事 件监听 类 FieldChangeListener
FieldChangeListener myButtonListener = new FieldChangeListener() {
public void fieldChanged(Field field, int context) { ButtonField fieldChanged = (ButtonField) field;
//begin testing to see what field changed if( fieldChanged == newButton) {
Message message = new Message(new Date(), sen derField.getText(),
subjectField.getText(), contentField.getText(), Message.STATUS_NEW);
_list.addMessage(message);
close();
}
// 其他类似 代码从 略
}
};
//-------------------------------------------------- ----------------
FooterManager manager = new FooterManager();
newButton = new ButtonField(" 提交 ");
newButton.setChangeListener(myButtonListener);
if (_editable) manager.add(newButton);
// 其他类似 代码从 略
// 最后把布 局管理 器连同 里面 的两个按 钮一起 放到 从 窗口上
add(manager);
}
4.4 自定 义布局 管理器
BlackBe rry UI API 中,屏幕 窗口的布 局管理 器有很 多, 比如 Flow Fie ld Man ager, G rid Fie ld Man ager, H orizon ta lFie ld Man ager, Vert icalFie ld Man ag e r 以及 延伸出 来的各种 子类。 但是客 户的 要求多种 多 样,这些 窗口管 理器不 一定 能满足 所 有客户 的要求 。
在本案中, 客户提 出屏幕 下方的两 个命令 按钮需 要并 排摆放, 这看上 去是可 以用 H orizon ta lFie ld Man ager 来处 理,但是 客户又 指定说 这两 个命令按 钮摆放 的时候 ,第 一个按钮 距离屏 幕左边两 个字符 大小, 第二 个按钮距 离屏幕 中间左 边两 个字符大 小。这 就需要 我们 自己编写 一个窗 口管理器 ,在 s ub lay ou t(in t w id th , in t h e ight ) 方法中通 过 se tPo s ition Child () 方法设 置各 个按钮 Fi e ld 的 摆放位置 ,通过 lay ou tCh ild( ) 方法设置 Fie ld 的高度 / 宽度 ;通过 s e tE xte nt (int width , in t h e ight ) 方法设 置这个区 域的高 度和宽 度。
p ublic class FooterManager extends Manager {
public FooterManager() {
super(0);
}
protected void sublayout (int width, int height) {
int fieldWidth = 100;
int filedHeight = 100; Field field = getField(0);
// 设置 filed 的 x 位 置为从 左边起 ,空两个 字符; y 位置为 0
setPositionChild(field, getFont().getHeight() * 2, 0);
layoutChild(field, fieldWidth, filedHeight); //lay out the field
field = getField(1);
// 设置 filed 的 x 位 置为从 中间 左边起, 空两个 字符; y 位置为 0
setPositionChild(field, width/2 + getFont().getHei ght() * 2, 0);
layoutChild(field, fieldWidth, filedHeight); //lay out the field
// 设置整个 区域的 高度为 按钮 字段的高 度即可 ,不需 要很高
setExtent(width, getFont().getHeight() + 20);
}
4.5 从窗口的 最终运 行结 果如图
5 处理黑莓手机的返回键 (Re t ur n ) ,轨迹球 (T r ac kBa ll ) 事件, 输入字 段数据 变化等事件
5.1 键盘 / 轨迹 球事件 处理
在主窗口 MessagesLis tViewScreen 中,每当用 户按下黑 莓的滚 轮 ,或 者轨 迹球,或 者是按 下键盘上 面的回 车键, 用户 都希望能 打开并 查看他 所选 中的申请 记录 。
protected boolean navigationClick (int status, int time) { Message message = list.getSelectedMessage();
//Open message screen
MessageViewScreen screen = new MessageViewScreen(list, message, false); UiApplication.getUiApplication().pushScreen(screen);
return true;
}
protected boolean keyChar (char key, int status, int time) {
boolean retVal = false;
if(key == Characters.ENTER){
Message message = list.getSelectedMessage();
//Open message screen
MessageViewScreen screen = new MessageViewScreen(list, message, false);
UiApplication.getUiApplication().pushScreen(screen);
retVal = true;
}
return retVal;
}
5.2 输入字 段数据 变化事件 处理
在从窗口 M e s s age Vie w Scr e e n ,如果 是新建 申请记 录, 当用户在 屏幕中 录入或 者修 改了数据 , 然后
按 q we rt 键 盘上的 R e tu rn 键 试图关闭 当前窗 口的时 候, 我们可以 在 on Sav e () 方 法中 捕获用户 的退出 事件,把 用户的 输入保 存起 来。
这里我们把 新建记 录保存 到主窗口 的申请 记录列表 _ li s t 里面 。
protected boolean onSave() {
boolean save = super.onSave();
if (save) {
Message message = new Message(new Date(dateField.getDate()),
senderField.getText(), subjectField.getText(), contentField.getText(), Message.STATUS_NEW);
_list.addMessage(message);
}
return save;
}
6 配置模拟器中 文显示, 单步跟踪调试
6.1 配置模 拟器使 之具备显 示中文, 录入中 文的能 力 大部分开发 工具 ( J DE / eJ DE) 内置的或 者是独 立安装 的手 机模拟器 缺省都 没有安 装中 文语言包 ,缺省 用户界面 是英文 。我们 可以 编辑相应 的模拟 器配置 x m l 文件,加 入中文 语言包 和输 入法,然 后在模 拟器里面 点击 Op tion s - > L an gu age an d Te xt Inpu t - > L an g u age ,选择 “简体 中文”, 在模拟器 里面 点
击 Op tion s - - > L an gu age an d Te xt Inpu t - > Inpu t Lan gu age ,选择“ 拼音( 简体中 文) ”,保存 即可; 如果在测 试模拟 器配置 x m l 文件之前 运行过 这个模 拟器 ,那么需 要执行 compon e n ts/ s i m u lat or /cle an . b at 脚本把模拟 器环境 清理 为干净的 运行 环 境,这 一过 程大概需 要 2 到
3 分钟。
Com p on e n t Pa ck 5.0/O S 5.0/9 700 模拟 器的配 置:
编辑 e J DE 安装目录 p lu gins /n e t.rim . e jd e .co m p on e n tp ack 5.0.0_ 5.0.0.1 4 /
compon e n ts/ s i m u lat or /9700 . xm l 文件 ,在 < /Si m u lat orCon f igurat io n > 之 前加入 下面四 行 ,就可 以让
9700 模 拟器具 备显示 中文的 能力。
< App lic at ion > n e t.rim .b lackb e rry .lan g.zh _ CN< /App lic at ion >
< App lic at ion > n e t.rim .b lackb e rry .lan g.zh _ CN.de f au ltRe s ou rce< / App lic at ion >
< App lic at ion > n e t.rim .b lackb e rry .lan g.zh _ CN.lo caliza tio n < / App lic at ion >
< App lic at ion > n e t.rim .b lackb e rry .lan g.zh _ CN.re nde rin g< /A pp lic at ion >
Com p on e n t Pa ck 4.5/O S 4.5/8 300 模拟 器的配 置:
编辑 e J DE 安装目录 p lu gins /n e t.rim . e jd e .co m p on e n tp ack 4.5.04.5. 0.21 /
compon e n ts/ s i m u lat or /8300 . xm l 文件 ,在 < /Si m u lat orCon f igurat ion > 之 前加入 下面两 行就可以 让 9700
模拟器具 备显示 中文和 输入 中文的能 力。
< App lic at ion > n e t.rim .b lackb e rry .lan g.zh _ CN_P iny in < /App l ication >
< App lic at ion > n e t.rim .b lackb e rry .lan g.zh _ CN.re nde rin gSup p ort</App lic at ion >
6.2 单步跟 踪调试
在 BlackBe rry 开 发环境 中对 手机程序 进行单 步跟踪 调试 是一件很 容易的 事情。 Black Be rry Ja v a Plug -
in for E cli p s e 可 以借助 e cli p s e 强大的 d e bu g 能力对 手机 程序 进行 代码跟 踪调试 。具 体操作很 简单, 只要在代 码编辑 界面中 ,双 击左边边 框 加入 跟踪断 点, 然后点击 e cli p s e 按钮 De b u g 即可。
在 d e bu g 过程中, e cli p s e 的 d e bu g 功能大 都能够 使用 ,包括单 步跟踪 调试, 显示 和编辑代 码中的 变量等等 。这里 就不赘 述了 。
提示:手机 程序 J a v a 代码 Sy s te m .ou t.p rin tln 的输出只 有在 e J DE d e bu g 状态中 才会 输出到 e cli ps e
con s ole 窗 口上。
7 OT A 应用部 署
应客户的要 求,需 要为不 同 OS 版本 的手机 8 300/ 970 0 分别打 包应用 程序为 jad /a lx 包, 并 架设
OT A 部 署服务 器为 83 00/9 70 0 手机自 动部署 对应 OS 版 本的程序 。
7.1 为不同 OS 版本 的手机 8 310/ 89 10 分 别打包 应用程序 为 jad /alx 包
在开发工具 中,为 不同 OS 版本的手 机,比 如 OS 4.5 的 8300 , OS 5.0 的 9700 手 机分别打 包是一 件 轻而易举 的事情 。
首先在 e cli p s e 选择项 目, 选择菜单 Pro j e ct - > P rop e rtie s ,左 边选择 J av a Build Pa th ,右边横 向栏目
选择第三 个 Lib rarie s ,你可 以看到项 目当前 配置的 Buil d 环境设置为 哪个版 本 OS 版本。 选 择“ J RE Sy s te m Lib rary [ Black Be rry JR E 5.0.0 ] ”,选 择“ Ed it ”按钮 ,在对话 框 Alte rn at e J RE 选 择 BlackBe rry
J RE 4.5.0 , 然后 保存。
|
|
录下面看 到 4.5.0 子目录, 里面是刚 刚 p ack age 好的 co d 二进制运行 文件, jad 等文 件。现在 你可以
OT A 方 式无线 部署这 个应用 到手机上 面了, 或者是 使用 ja v alo ad e r 命令 行安装 cod 文件到手 机上。
如果你想让 用户可 以在电 脑上面通 过黑莓 桌面管 理器 安装软件 给手机 ,那么 你只 需要编辑
BlackBe rry _ App _ D e s cripto r.x m l 文件 ,在第 二个栏 目 Buil d 里面,勾上 Ge n e rate .a lx fi le 选项 ,然后 重
新 p ack age 项目 即可生成 a l x 文件。
7.2 架设 O T A 部 署服务 器为 8300 /9 700 手 机分发 程序
在 开发人员 教程 - RIM 开 发 人员教 程 “ A70 如何 部 署 和 分发应 用 程 序 ” 中对如 何设 置 OT A 服务器 有 详细的描 述。这 里就简 单说 明一下。
首先安装 ap ach e h tt p se r v e r 2.0 , 编辑 con f / m i me .type s 文件 ,在最 后加入 下面三 行,然后 重新启
动 ap ach e 服务器 。
app lic at ion /ja v a - arch i v e jar app lic at ion /v nd .rim .cod cod text/v nd .s un .j2 me .ap p - d es cri p to r jad
|
|
7.3 架设 O T A 部 署服务 器为 8300 /9 700 手 机自动 部署对 应 OS 版本 的程序
上一节中, 通过 ap ach e w e b 服务器 h tml 页面发 布手机 程序,需 要最终 用户在 手机 浏览器页 面上手 工选择手 机型号 / 操作 系统 版本,然 后点击 安装, 这对 企业用户 而言用 户体验 并不 友好。 我们希望当 企业用 户使用 8 300 手机 访问 h ttp :/ /1 92.16 8. 1.102: 8080 / U ISa m p le .ja d 的 时候,服 务器可 以自动地 把对应 的 4.5. 0 /U ISa m p le .ja d , 4.5 .0/U I Sampl e . co d 等文件分发 给手 机;而当 企业用户 使用
9700 手 机访问 h ttp :/ / 192.1 68 .1.102: 8080 / U ISa m p le .ja d , 服务器可 以自动 地把对 应的
5.0.0 /U I Sampl e .ja d , 5.0.0 /U I Sample . cod 等文件 分发给手 机。
幸运的是, 黑莓手 机会把 自己 的设 备型号 / 操作 系统 版本等信 息通过 h tt p 请求头 传递给 Web 服务 器。比如 8 300 手 机传递给 服务器的 h tt p h e ad e r us e r - a ge n t 的值为
BlackBe rry 8 300/ 4.5.0.4 4 Pro f i le /MIDP - 2.0 Con f igurat ion /C L DC - 1 .1 Vend orID/ - 1 ; 9700 手机传递 给服务
器的 h tt p h e ad e r u se r - a ge n t 的值为
BlackBe rry 9 700/ 5.0.0.3 34 Pro f ile / MIDP - 2.1 Conf igurat ion /C LDC- 1.1 Vend orID/ - 1 。有了 u se r - agent 信 息, Web 服 务器就 可以了解 客户端设 备的能力 。
在 T om cat 等 J 2E E 服务器 上面,你 可以通 过 Se r v l e t A PI re qu es t.g e t H e ad e r ( "us e r - a ge n t" ) 获 得上述 信 息,然后 自动找 到对应 版本 的 jad /ja r/cod 文件发送 给客 户端。 服务器端编 码的工 作,前 人已经做 了很多 ,我们 拿来 稍微改就 可以在 J 2E E 服务 器上面自 动地为 不 同型号黑 莓手机 分发对 应版 本的 应用 程序文 件了。 核心 代码说明 参考 Su n 的文 章 M IDP Pro v i s ion in g With Serv l e ts (见附 录)。
我们为黑莓 手机对 Su n 网站提供的 代码 做 了如下 修改 。
首先修改 p ro v i s ion e r.p ro p s 文件,设 定 8300 和 970 0 对 应的不同 目录下 面的 U I Sam p le 文件。 ( 相应 的,要把 BlackBe rry 项目 de liv e rab l e s 目录的 两个子目 录 4.5.0 和 5. 0.0 和 里面的文 件拷贝到 J 2E E
WAR 文件 根目录 下面 ) 。
device[BlackBerry8300]=BlackBerry8300
device[BlackBerry9700]=BlackBerry9700
BlackBerry8300[UISample.jad]=4.5.0/UISample.jad
BlackBerry8300[UISample.jar]=4.5.0/UISample .jar
BlackBerry8300[UISample.cod]=4.5.0/UISample.cod
BlackBerry9700[UISample.jad]=5.0.0/UISample.jad BlackBerry9700[UISample.jar]=5.0.0/UISample.jar BlackBerry9700[UISample.cod]=5.0.0/UISample.cod
然后修改 Pro v is ion e r.jav a 代码,加 入 cod 文件 后缀的 MIME 定义( 原有代 码已经 有 jad 和 jar 的
MIME 定义) 。
// The Bl ackBerr y COD e xte nsio n
priv at e s t ati c fi na l St ri ng COD_ E XT = " .co d";
// The Bl ackBer r y COD M IME ty pe - J i an g
private s tatic final S tring COD_MIME = " a pplicat i on/vnd.ri m.c od";
在 streamFile(file, response ) 方法中加入 对 COD MIME 类型的 处理 ,告诉客 户端浏
览器将要 发送 cod 文 件以 及对应 MIME 类 型。
i f ( f ile .g et P at h() .e nd sWit h( J AD_ E XT ) ) re spo nse .s et Co nte nt T y pe ( J AD_M I M E ) ;
i f ( f ile .g et P at h() .e nd sWit h( J AR_ E XT ) ) re spo nse .se t Co nte nt T y pe ( J AR_M IME ) ;
i f ( f ile. g et Pa t h ().endsWith( COD_ EXT )) response. s etContent T yp e ( COD_MIME );
在 d oGe t() 方 法的最 前面通 知手机浏 览器和 代理服 务器 (比如 Black Be rry MD S )对 此 U RL 不 要做任
何 cach e 处理 。
re spo nse .se t He ader( "C ac he -C o ntrol ", "no - st ore "); //H T T P 1.1
re spo nse .se t He ader( "P r agm a" ,"no -c ac he "); //HT T P 1. 0
re spo nse .se t Date He ade r ( "E xpire s", 0); //preve nt s c ac hi ng a t t he p ro xy s erve r
现在我们把 这个 J 2E E WAR 包部署到 T om cat 服务器上 面,不同 手机通 过一个 U RL 就可以安 装对应 的不同版 本的手 机程序 了, 这大大提 高了用 户体验 ,降 低了管理 员维护 的负担 。
8 后记
经过以上 整个开 发部署 流程 , 从环境 搭建, 代码开 发, 模拟器测 试,单 步跟踪 调试 ,中文模 拟器配 置,到静 态和动 态自动 的 O T A 部署 ,我 们可以 把这个 典型的移 动办公 审批场 景下 的应用程 序部署 到客户手 机终端 上了。
相信读者 看完本 文以后 有信 心 自己动 手在黑 莓手机 平台 上面开发 移动办 公应用 了。 您回到公 司后, 可以从调 研企业 领导和 业务 人员需要 及时有 效处理 的业 务流程 着 手,马 上开始 调研 / 设计 / 开 发企业 的移动办 公应用 。
注:
在黑莓手 机平台 上,可 以采 用 BlackBe rry UI API (ne t.ri m . d ev ic e .ap i.u i 包 )/ MI DP U I API
(jav ax .m icroedition .lcdu i 包 )/ Wid ge t (HT ML, CSS, 以及 J a v aS cript) 等三种 A PI 开发 应用程 序的用户 界面, 其中前面 两种是 J av a API , Wid ge t 是 Web U I API 。
常用资源 链接
1 BlackBe rry 开发者 中文门 户
http: / /cn.blackb err y .com/ dev elo p er s /
2 即刻开 始了解 B lackBe r ry 开发
h tt p : / / cn.b lackb erry.c o m/ d ev el o p ers / st arted /
3 开发人 员教程 - RIM 开发 人员教程
http: / /cn.blackb err y .com/ dev elo p er s /r e so urce s/t u t o rials. j sp #t ab _t ab _ d e v elo pm e nt
4 BlackB e rry 开发者 英文门 户
http: / /ww w. b lack b e rry.c o m / d evelo p ers
5 BlackBe rry Supp ort Com m u n ity Fo ru m s 官网 论坛, 英文 好的同学 值得去 潜水, 发帖 提问
h ttp :/ /s upp ortforu ms .b lackb e rry .com/ri m /
6 BlackBe rry 文档库
http: / / w w w. b lack b err y .c o m / bt s c
本文参 考 链接:
1 A 70 如何 部署和 分发应用 程序
h ttp :/ /n a.b lackb e rry .com/dev e lop e rs /re s ou r ce s /A7 0_ H o w _ to _ De p loy _ and _ D is tribu te _ A pp lic at ion s_ V1.p
df
2 MIDP Pro v i s ion in g With Ser v le t s http: / /d ev elop ers . s un.co m /mobil i ty/ m idp/ttip s/ p r o v i sio n i n g/in d ex. h tml
3 Go o gle 搜索
例如,使 用 G oogl e 搜索 b la ckb e rry .com 上 面关于 Li s tFi e ld 如何设置 背景色 的讨论 : 搜索 Lis tFi e ld b ack groun d si t e :bla ckb e rry .co m
BlackBerry SDK下载
相关链接:
BlackBerry 用户界面开发实例(一)
BlackBerry 用户界面开发实例(二)