1

我正在尝试为黑莓 5.0+ 应用程序创建一个屏幕,该应用程序在顶部有一个横幅,然后在Browserfield下面有一个可以查看外部站点的横幅。横幅托管在一个站点上,而内容BrowserField托管在另一个站点上。

最初我尝试使用 2 BrowserFields,但是当几个设备没有显示横幅并且只显示下面的内容时遇到了问题。此外,当显示具有相同设置的另一个屏幕时,应用程序会崩溃并显示IllegalStateException. 我做了一些研究,当它同时存在几个实例时BrowserField似乎有一些麻烦。

因此,为了解决这个问题,我将两个BrowserFields 合并为一个,使用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 作为文本读取,删除\nand \rs,然后将其放入以下方法中: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;
 }
 }
4

1 回答 1

2

好的,我为第一个答案道歉。我认为这DOCTYPE是一个红鲱鱼(但我当时没有你的 Java代码)。

我看到了一些潜在的问题:

网络连接

首先,与往常一样,确保您的设备或模拟器具有网络连接。这可能包括正在运行的 MDS 模拟器。您始终可以使用普通浏览器应用程序测试连接性,检查您知道正在运行的网站。我相信,如果您完全没有连接(即网络禁用),那么您的框架将只显示文本/URL。但是,我相信它也会有这样的东西:

无法选择正确的传输描述符:http ://www.penny-arcade.com

而不是显示null, 正如你所展示的。

添加浏览器字段

接下来,我认为您在添加字段之前要求浏览器字段显示内容存在问题。只需将这两行代码的顺序切换为:

   add(browserField);

   try
   {
      String embeddedLinkFrame = readTextFile("frame.html");
      browserField.displayContent(embeddedLinkFrame, "http://localhost");
   }
   catch (Exception e)
   {
      System.out.println(e.getMessage());
   }

但是,我相信如果这些行乱序的行为只是获得一个空白的浏览器字段。

视口属性

最后,我不建议像您所做的那样以编程方式设置页面属性。尽管这不会阻止您的页面显示,但我建议将这些属性放在 HTMLmeta元素中:

<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> 
</head>

资料来源:BlackBerry.com


更新:协议控制器

不幸的是,我的模拟器正在运行,并且现在拒绝支持热插拔。所以,我很难跑很多次,收集到决定性的结果。但是,在我看来,移除你的ProtocolController对象可以防止这个问题发生在我身上。(也许您可以澄清为什么在这种情况下使用协议控制器?)。 如果这个答案是一个动机,您可能会仔细查看发布者关于它的有用性的完整评论。

于 2013-05-22T09:30:23.800 回答