Использование Browserfield.displayContent с <frame>, который имеет внешний URL

Я пытаюсь создать экран для приложения Blackberry 5.0+ с баннером вверху, а затем Browserfield под этим просматривается внешний сайт. Баннер размещается на одном сайте, а контент для BrowserField размещен на другом.

Первоначально я пытался использовать 2 BrowserFields, но у меня были проблемы, когда несколько устройств не отображали баннер и отображали только содержимое под ним. Кроме того, при отображении другого экрана с такой же настройкой приложение зависнет с IllegalStateException, Я провел небольшое исследование, и кажется, что BrowserField кажется, есть некоторые проблемы, когда существует несколько его экземпляров одновременно.

Таким образом, чтобы обойти эту проблему, я объединил оба BrowserFields в один, используя тег frame в 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");

Этот метод должен отображать 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;
 }
 }

1 ответ

Решение

Хорошо, мои извинения за первый ответ. Я думаю DOCTYPE была красная сельдь (но у меня не было вашего кода Java в то время).

Я вижу несколько потенциальных проблем:

Подключение к сети

Во-первых, как всегда, убедитесь, что у вас есть сетевое подключение для вашего устройства или симулятора. Это может включать запуск симулятора MDS. Вы всегда можете проверить соединение с обычным приложением Browser, проверив веб-сайт, который, как вы знаете, работает. Я считаю, что если у вас полное отсутствие подключения (то есть сеть отключена), то вы получите ваши кадры, показывающие только текст / URL. Тем не менее, я считаю, что это также будет иметь что-то вроде этого:

Не удалось выбрать правильный дескриптор транспорта для: http://www.penny-arcade.com/

вместо показа null, как вы показываете.

Добавление BrowserField

Далее, я думаю, что есть проблема с тем, что вы просили в поле браузера отобразить контент, прежде чем вы добавите это поле. Просто измените порядок этих двух строк кода следующим образом:

   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>

Источник: BlackBerry.com


Обновление: контроллер протокола

К сожалению, мой симулятор работает и отказывается поддерживать горячую замену прямо сейчас. Поэтому мне трудно много раз бегать и собирать решающие результаты. Но, похоже на то, ProtocolController объект предотвращает эту проблему для меня. (может быть, вы можете уточнить, почему вы используете контроллер протокола в этой ситуации?). Если этот ответ был мотивом, вы можете внимательно посмотреть на полные комментарии автора о его полезности.

Другие вопросы по тегам