【发布时间】:2013-05-21 14:52:27
【问题描述】:
我正在尝试为黑莓 5.0+ 应用程序创建一个屏幕,该应用程序在顶部有一个横幅,然后在下面有一个 Browserfield,用于查看外部站点。横幅托管在一个站点上,BrowserField 的内容托管在另一个站点上。
最初我尝试使用 2 个 BrowserFields,但是当多个设备没有显示横幅而只显示下面的内容时遇到了问题。此外,当显示具有相同设置的另一个屏幕时,应用程序将崩溃并显示IllegalStateException。我做了一些研究,似乎BrowserField 似乎有一些trouble when several instances of it exist at once.
所以为了解决这个问题,我将BrowserFields 合并为一个,使用frame tag in html,希望在第一帧显示横幅广告,在第二帧显示下方的内容。
我制作的html可以在普通浏览器中运行:
<!DOCTYPE html>
<html>
<frameset rows="10%,90%">
<frame scrolling="no" src="http://4.bp.blogspot.com/_CZ1HhhanNgc/TI0xscVLW8I/AAAAAAAABps/sfeO4E3234k/s1600/head-mp-700x88.jpg" noresize="noresize" frameborder="0">
<frame src="http://www.penny-arcade.com" frameborder="0">
</frameset>
</html>
我正在做的是将html作为文本读取,删除\n和\rs,然后将其放入以下方法中:browserField.displayContent(html,"http://localhost");
This method is supposed to display the html in the browser,但在模拟器上我得到了这个:
在设备上我得到一个空白屏幕。我不知道displayContent() 方法发生了什么,所以我假设它不允许外部站点?从现在开始,我真的不知道我的选择是什么。是否有某种修复方法、我可以使用的某个库或其他方式来实现它?
编辑:
所以@Nate 建议更改DOCTYPE 标签,并发布了html 工作的屏幕截图。但是我这样做了,我仍然得到相同的结果,所以我将发布我用来制作屏幕的代码。这里是:
public final class MyScreen extends MainScreen
{
/**
* Creates a new MyScreen object
*/
private BrowserField browserField;
public MyScreen()
{
// Set the displayed title of the screen
setTitle("MyTitle");
BrowserFieldConfig config = new BrowserFieldConfig();
config.setProperty(BrowserFieldConfig.VIEWPORT_WIDTH, new Integer(Display.getWidth()));
config.setProperty(BrowserFieldConfig.NAVIGATION_MODE,
BrowserFieldConfig.NAVIGATION_MODE_POINTER);
config.setProperty(BrowserFieldConfig.INITIAL_SCALE, new Float(1.0));
config.setProperty(BrowserFieldConfig.USER_SCALABLE, Boolean.FALSE);
//supposed to prevent InvalidStateException from refreshing sometimes
ProtocolController eventsProtocolController = new ProtocolController(browserField)
{
public void handleNavigationRequest(BrowserFieldRequest request) throws Exception
{
browserField.setFocus();
super.handleNavigationRequest(request);
}
};
config.setProperty(BrowserFieldConfig.CONTROLLER, eventsProtocolController);
browserField = new BrowserField(config);
try
{
String embeddedLinkFrame = readTextFile("frame.html");
browserField.displayContent(embeddedLinkFrame, "http://localhost");
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
add(browserField);
}
public String readTextFile(String fName)
{
String result = null;
DataInputStream is = null;
try
{
is = new DataInputStream(getClass().getResourceAsStream("/" + fName));
byte[] data = IOUtilities.streamToBytes(is);
result = new String(data);
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
finally
{
try
{
if (null != is)
is.close();
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
}
return result;
}
}
【问题讨论】:
标签: java html blackberry frame browserfield