1

Browserfield上部にバナーがあり、その下に外部サイトが表示される blackberry 5.0+ アプリの画面を作成しようとしています。バナーは 1 つのサイトでホストされ、のコンテンツはBrowserField別のサイトでホストされます。

最初は 2 つの BrowserFields を使用してみましたが、複数のデバイスでバナーが表示されず、その下のコンテンツのみが表示されるという問題がありました。さらに、同じ設定の別の画面が表示されると、アプリがクラッシュしてIllegalStateException. 少し調べてBrowserFieldたところ、一度に複数のインスタンスが存在すると問題が発生するようです。

したがって、この問題を回避するために、最初のフレームにバナー広告を表示し、2 番目のフレームにその下のコンテンツを表示することを期待して、htmlBrowserFieldの frame タグを使用して両方を 1 つに結合しました。

私が作成した 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を削除し\rてから、次のメソッドに入れることです。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 シミュレーターの実行が含まれる場合があります。実行中の Web サイトをチェックして、通常のブラウザアプリとの接続をいつでもテストできます。接続がまったくない場合 (つまり、ネットワークが無効になっている場合)、フレームにテキスト/URL だけが表示されると思います。ただし、次のようなものもあると思います。

適切なトランスポート記述子を選択できませんでした: http://www.penny-arcade.com

あなたが示すように、表示する代わりにnull

BrowserField の追加

次に、フィールドを追加する前にブラウザ フィールドにコンテンツを表示するように要求することに問題があると思います。この 2 行のコードの順序を次のように変更するだけです。

   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 に答える