我正在尝试为黑莓 5.0+ 应用程序创建一个屏幕,该应用程序在顶部有一个横幅,然后在Browserfield
下面有一个可以查看外部站点的横幅。横幅托管在一个站点上,而内容BrowserField
托管在另一个站点上。
最初我尝试使用 2 BrowserFields,但是当几个设备没有显示横幅并且只显示下面的内容时遇到了问题。此外,当显示具有相同设置的另一个屏幕时,应用程序会崩溃并显示IllegalStateException
. 我做了一些研究,当它同时存在几个实例时BrowserField
似乎有一些麻烦。
因此,为了解决这个问题,我将两个BrowserField
s 合并为一个,使用html 中的 frame 标签,希望在第一帧中显示横幅广告,在第二帧中显示下面的内容。
我制作的 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
and \r
s,然后将其放入以下方法中:browserField.displayContent(html,"http://localhost");
此方法应该在浏览器中显示 html,但在模拟器上我得到了这个:
在设备上,我得到一个空白屏幕。我不知道该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;
}
}