我正在尝试为Blackberry 5.0+应用程序创建一个屏幕,该屏幕的顶部有一个横幅,然后在其下方有一个Browserfield
来查看外部站点。标语托管在一个站点上,而BrowserField
的内容托管在另一个站点上。
最初,我尝试使用2个BrowserFields,但是当多个设备不显示横幅并且仅显示下面的内容时出现问题。此外,当显示具有相同设置的另一个屏幕时,应用程序将崩溃并显示IllegalStateException
。我做了一些研究,看来BrowserField
似乎有些trouble when several instances of it exist at once.
因此,为了解决此问题,我使用frame tag in html将两个BrowserField
组合为一个,希望在第一帧中显示横幅广告,在第二帧中显示内容。
我制作的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
和\r
,然后将其放入以下方法中: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;
}
}
最佳答案
好的,我为第一个答案表示歉意。我认为DOCTYPE
是一个红鲱鱼(但当时我没有您的Java代码)。
我看到一些潜在的问题:
网络连接
首先,与往常一样,请确保您的设备或模拟器具有网络连接。这可能包括MDS模拟器正在运行。您始终可以通过正常的浏览器应用程序测试连接性,并检查您知道正在运行的网站。我相信,如果您完全缺乏连通性(即禁用网络),那么您的框架只会显示文本/ URL。但是,我相信它也会有这样的东西:
无法为以下内容选择正确的传输描述符:http://www.penny-arcade.com
而不是像显示的那样显示null
。
添加BrowserField
接下来,我认为there is a problem要求您在添加字段之前要求浏览器字段显示内容。只需将这两行代码的顺序切换为此:
add(browserField);
try
{
String embeddedLinkFrame = readTextFile("frame.html");
browserField.displayContent(embeddedLinkFrame, "http://localhost");
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
我相信,如果这些行顺序混乱,那么行为仅仅是为了获得空白的浏览器字段。
视口属性
最后,我不建议像您那样以编程方式设置页面属性。尽管这不会阻止页面显示,但我建议将这些属性放在HTML
meta
元素中:<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
</head>
Source: BlackBerry.com
更新:协议控制器
不幸的是,我的模拟器正在运行,并且现在拒绝支持热插拔。因此,我很难多次跑步并获得决定性的结果。但是,在我看来,删除您的
ProtocolController
对象可以防止出现此问题。 (也许您可以弄清为什么在这种情况下使用协议控制器?)。 If this answer was a motivation,您可能会仔细查看发布者对其有用性的完整评论。