【问题标题】:Using Browserfield.displayContent with <frame> that has an external url将 Browserfield.displayContent 与具有外部 url 的 <frame> 一起使用
【发布时间】: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


    【解决方案1】:

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

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

    网络连接

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

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

    而不是像您显示的那样显示null

    添加浏览器字段

    接下来,我认为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,你可以仔细看看海报的完整内容,了解它的用处。

    【讨论】:

    • 这三个建议都不起作用。网络肯定正在运行,因为我在设备上尝试过它(我的其他一些应用程序可以很好地加载它们的浏览器字段)。我颠倒了 add(browserField);和 browserField.displayContent() 无济于事。我从代码中删除了页面属性并按照建议放置了元标记。你能让浏览器字段工作吗?
    • 是的,我确实运行过它。我假设您在问我是否能够让您的代码正常工作?如果您仍然遇到问题,我需要确切地知道您的配置是什么。最好从模拟器开始,因为这对我来说更容易复制。那么,什么设备/模拟器? 9550?哪个操作系统版本?你在用 MDS 模拟器运行吗?在您的设备/模拟器上,是否都启用了蜂窝和 WiFi 网络?在运行您的应用程序之前,您可以使用普通的 Browser 应用程序浏览这两个链接吗?您是否总是看到屏幕截图,或者有时只是空白?
    • 很好用。我可以发誓我试着把它拿出来......非常感谢你的帮助!
    • @JasonRidge,很高兴听到我们终于明白了 :)
    猜你喜欢
    • 2021-06-09
    • 2016-10-22
    • 2018-05-15
    • 2010-11-27
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多