我正在尝试为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,您可能会仔细查看发布者对其有用性的完整评论。

09-30 08:57