专注于Blackberry

每周一技:HyperLinkField

这是每周一技的第二篇了。
前一篇介绍了从BES读取contacts的技术以及遇到相关问题的解决方案(via 每周一技:从BES服务器上lookup联系人)。
本篇将介绍如何编写自定义的超级链接控件。
背景
在很多情况下,我们都会遇见超级连接的显示,遗憾的是在Blackberry没有提供类似于HyperLinkField的组件,这给我们增加了很多麻烦,如果能够解决该问题,将会是一个不错的选择。
分析
既然Blackberry API没有,我们自己可以写一个该Field,在这里,我们将之命名为HyperLinkField,以符合Blackberry API命名的规则。
实现
先看几张效果图:
图1,当focus在其他field时HyperLinkField的样式.

图2 当光标移到该field上时,颜色会变蓝,当然你也可以更改颜色。

图3,当点击该Field时,

图4,其菜单如下

该Get Page就会打开连接。
在编写代码需要注意一下几个地方:

参数的设置
Layout的处理
如何paint
菜单的处理
点击该field如何处理

下面给出部分重要的代码。
package com.taigoo.blackberry.weekskills.hyperlink;

import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.DrawStyle;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.ContextMenu;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.system.Display;
import net.rim.blackberry.api.browser.*;

public class HyperLinkField extends Field {

private String _displayName ;
private String _url;
private Font _font;
private MenuItem _openMenuItem;

/**
[...]

继续阅读本文 →

  

Confach发表于 July 14, 2009 7:35 pm | 留言 |每周一技 

BlackBerry 应用程序开发者指南 第二卷:高级–第5章 BlackBerry浏览器

5
               第5章 BlackBerry浏览器

浏览器API
在浏览器显示Web内容
在一个浏览器域里显示Web内容
支持附加的MIME类型
注册一个HTTP过滤器

浏览器API

API名和包

描述

浏览器应用程序API(net.rim.blackberry.api.browser)

通过调用Blackberry浏览器,API允许应用程序显示web内容,包括支持的图片格式,HTML以及WML页面.也允许应用程序提供HTTP请求的一个Referrer,HTTP头,以及提交的内容.为获得更多信息,参看51页的”在浏览器显示Web内容”.

浏览器域API
(net.rim.blackberry.api.browser.field)

此API允许一个应用程序获取web内容在一个浏览器域里的显示,此域包含在应用程序UI里.也允许应用程序配置浏览器域的表现形式,例如去除滚动条,或者指定仅显示屏幕一部分的浏览器域.

浏览器页面API(net.rim.blackberry.api.browser.plugin)

此API允许应用程序支持附加的MIME类型.当BlackBerry启动时,注册一个提交提供者,所有后发的浏览器对话将支持附加的MIME类型.为获取更多信息,参看66页的”支持附加的MIME类型”.

HTTP过滤器API
(net.rim.device.api.io.http)

API允许应用程序向浏览器注册一个或多个URL的提供者.为获取更多信息,参看71页的”注册一个HTTP过滤器”.

在浏览器里显示Web内容
为了在浏览器里显示web内容,使用浏览器应用程序API(net.rim.blackberry.api.browser).
获取一个浏览器对话(Session)
为了获取一个缺省的BrowserSession对象,调用静态方法Browser.getDefaultSession().本对象允许你访问正在BlackBerry设备上运行的浏览器.
为了新增一个约会,调用EventList.importEvent(). 注:获取缺省的对话会覆写任何BlackBerry设备上已经打开的对话.
为获取一个不同的对话,调用getSession().此方法根据它的唯一ID(UID)获取一个浏览器配置服务记录.为获得更多信息,参见113页的”服务定制API”.
请求一个Web页面
为请求一个Web页面,调用BrowserSession.displayPage()方法.下面的实例使用了仅接受一个URL的displayPage()方法.为指定一个referrer,HTTP头,以及提交的数据,使用接受这些附加信息的方法.
代码实例
下面来自Restaurants.java实例的引用创建了一个菜单,此菜单会在浏览器中显示一个Web页面.

private MenuItem browserItem = new MenuItem(
       _resources.getString(MENUITEM_BROWSER), 110, 12) {
    public void run() {
       synchronized(store) {
           String websiteUrl = websitefield.getText();
           if (websiteUrl.length == 0) {
              Dialog.alert(_resources.getString(ALERT_NO_WEBSITE));
               }
           else {
              BrowserSession visit = Browser.getDefaultSession();
              visit.displayPage(websiteUrl);
              }
           }
       }
    };

在浏览器域显示Web内容
为了在应用程序UI里包含一个浏览器域,使用浏览器域API (net.rim.device.api.browser.field).浏览器呈现(rendering)库为域处理web内容的描绘,然后返回一个BrowserField-在此域URL内容得到描绘-到你的应用程序显示. 注:用来打开一个浏览器域的浏览器对话独立于BlackBerry设备上缺省的浏览器对话. 任何打开的浏览器对话则不受影响.
RenderingApplication接口定义了一个描绘对话所需要的回调功能来帮助处理URL资源, RenderingApplication接口的实现在一个浏览器域里显示web内容.
为呈现创建一个独立的线程
当应用程序获取和显示浏览器域时,为阻止应用程序挂起,在一个独立线程上完成这些操作.

class CreationThread extends [...]

继续阅读本文 →

  

Confach发表于 April 28, 2008 12:28 pm | 留言 |新闻