6

ブラックベリーアプリケーションでカスタムメニューを作成して、その外観を管理できるようにする必要があります。を拡張するクラスを作成し、抽象メソッドでカスタマイズするPopupScreenことで、カスタムメニューを作成することができました。のrun()メソッドをエミュレートするために、メソッドを抽象として作成しました。MenuItemLabelFieldinvokeAction()invokeAction()MenuItem

ここに画像の説明を入力してください

すべてが大丈夫でしたが、私は何かを覚えています。上司から、 SwitchApplicationCloseMenuItemなどのネイティブを実装するように求められた場合はどうなりますか。Closeの実装は問題になるとは思いませんが、 SwitchアプリケーションやShow Keyboardのような他のネイティブでは、これで問題が発生します。だから私は別の解決策を考え出し、これが私のコードです: MenuItem

public CustomMenu(MainScreen screen) {
        super(vfm);
        Menu menu = screen.getMenu(0);
        for(int i = 0; i < menu.getSize(); i++){
            final MenuItem finalMenu = menu.getItem(i);
            vfm.add(new CustomMenuItem(finalMenu.toString(), Field.FOCUSABLE){
                protected boolean invokeAction(int action) {
                    finalMenu.run();
                    return true;
                }
            });
        }
    }

これは私のコンストラクタですCustomMenu。のインスタンスをMainScreenパラメータとして受け入れ、のリストを取得MenuItemして既存のに追加しますCustomMenuinvokeAction()オーバーライドされたメソッドには、のメソッドの対応物がありrun()ますMenuItem。そして、これは私がしたことの結果です:

ここに画像の説明を入力してください

MenuItem私はそれらのネイティブを自分の中に入れることができましCustomMenuたが、問題は、それらのネイティブを呼び出す(クリックする)ときにMenuItem(アプリケーションの切り替え、閉じる)、を取得したことIllegalStateExceptionです。それらのネイティブの実装を取得する方法はありMenuItemますか?run()または、メソッドをキャプチャして、MenuItemそれを自分で呼び出す方法はありCustomMenuますか?

4

2 に答える 2

1

これらのリンクはあなたを助けるかもしれません

Blackberry(Blogspot)でカスタムメニューを作成する

Blackberry(WordPress)でカスタムメニューを作成する

于 2013-04-06T10:12:47.343 に答える
1

アップデート

OPからさらに明確にされた後、正解は、彼らが求めていることを実行できないことだと思います...独自のメニューを作成し、組み込みメニューからMenuItemコマンド/アクションをプログラムで呼び出します


元の回答

私があなたを正しく理解しているなら、あなたが望むのはあなた自身のメニューを作成することですが、あなたはあなたのメニューが異なって見える必要があるので、組み込みのBlackBerryメニューを使いたくないですか?

その場合は、別のアプローチを提案します。BlackBerryがこれを行う方法通常はMenuItemオブジェクトを組み込みのメニューに追加することですScreenが、クラスのmakeMenu()メソッドでメニューのさまざまなプロパティを変更することです。

protected void makeMenu(Menu menu, int context)

これを行うためのBlackBerryドキュメントは次のとおりです。これは、上記のメニュー項目の追加とメニューの外観の変更を組み合わせた例です。うまくいけば、これがあなたが望むことをするためのより簡単な方法であり、組み込みのメニューからあなたのメニューアイテムにMenuItemsをリンクする必要はありません:

public class MenuScreen extends MainScreen {
   private Background _menuBackground;
   private Border _menuBorder;
   private Font _menuFont;
   private MenuItem _customMenuItems[];

   public MenuScreen() {
      setTitle("Custom Menu Sample");
      getMainManager().setBackground(BackgroundFactory.createSolidBackground(Color.BLACK));

      RichTextField f = new RichTextField("Creating a custom menu") {                   

         protected void paint(Graphics g) {
            int oldColor = g.getColor();
            g.setColor(Color.WHITE);
            super.paint(g);
            g.setColor(oldColor);
         }
      };
      add(f);

      // Customize the look (border/color/font) of the BB menu here:
      XYEdges thickPadding = new XYEdges(10, 10, 10, 10);
      _menuBorder = BorderFactory.createRoundedBorder(thickPadding, Border.STYLE_DOTTED);        
      _menuBackground = BackgroundFactory.createSolidTransparentBackground(Color.DARKMAGENTA, 80);

      try
      {
         FontFamily family = FontFamily.forName("BBCasual");
         _menuFont = family.getFont(Font.PLAIN, 30, Ui.UNITS_px);
      }
      catch (final ClassNotFoundException cnfe)
      {
         UiApplication.getUiApplication().invokeLater(new Runnable()
         {
            public void run()
            {
               Dialog.alert("FontFamily.forName() threw " + cnfe.toString());
            }
         });              
      }       

      // Add our own menu items, too
      _customMenuItems = new MenuItem[3];
      _customMenuItems[0] = new MenuItem("Hola Dora!", 110, 10) {
         public void run() {
            Dialog.inform("Hola Dora!");
         }
      };
      _customMenuItems[1] = new MenuItem("Close popup!", 111, 10) {
         public void run() {
            Dialog.inform("Close popup!");
         }
      };
      _customMenuItems[2] = new MenuItem("Hola Diego!", 112, 10) {
         public void run() {
            Dialog.inform("Hola Diego!");
         }
      };

      addMenuItem(_customMenuItems[0]);
      addMenuItem(_customMenuItems[1]);
      addMenuItem(_customMenuItems[2]);      
   }

   protected void makeMenu(Menu menu, int context)
   {
      menu.setBorder(_menuBorder);
      menu.setBackground(_menuBackground);
      menu.setFont(_menuFont);
      // invoking super.makeMenu() will add {Close, Switch Application, etc.} items
      super.makeMenu(menu, context);
   }
}

結果

ここに画像の説明を入力してください

:OS 6.0以降のみをサポートする必要がある場合は、他のオプションもあります(お知らせください)。また、独自のメニューを作成する動機は、フォントの色を変更したいためである可能性があります。これは、上記のコードでは実行できないと思います。繰り返しになりますが、それがあなたのデザインの一部である場合は、お知らせください。ありがとう。

于 2013-04-06T23:11:19.177 に答える