在我的黑莓自定义菜单中调用本机MenuItem(切换应用程序,关闭等)

Jj *_*beo 6 java blackberry menu java-me

我需要在我的黑莓应用程序中创建一个自定义菜单,以便我可以管理它的外观.我设法创建了一个自定义菜单,创建了一个扩展a PopupScreen和使用抽象方法MenuItem自定义的类.我将该方法设计为抽象来模拟run()方法.LabelFieldinvokeAction()invokeAction()MenuItem

在此输入图像描述

一切都很好,但我记得一些东西.如果我的老板问我要实现本地MenuItem就像开关应用关闭.我不认为实现Close将是一个问题,但Switch应用程序和其他本机MenuItemShow Keyboard,这将给我一个问题.所以我想出另一个解决方案,这是我的代码:

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;
                }
            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的构造函数CustomMenu.我接受一个MainScreen作为我的参数的实例来获取列表MenuItem并将其添加到我现有的列表中CustomMenu.该invokeAction()重写的方法存在着对方run()的方法MenuItem.这是我所做的结果:

在此输入图像描述

我设法把那些本机MenuItem放在我CustomMenuMenuItem身上,但问题是当我调用(点击)那些原生(Switch Application,Close)我得到了IllegalStateException.有没有办法实现这些原生的MenuItem?或者一种捕获run()方法MenuItem然后在我的方法中调用它的方法CustomMenu

Nat*_*ate 1

更新

从OP获得更多澄清后,我相信正确的答案是你不能按照他们的要求去做......创建你自己的菜单,并以编程方式从内置菜单调用 MenuItem 命令/操作


原答案

如果我理解正确的话,您想要的是创建自己的菜单,但您不想使用内置的黑莓菜单,因为您的菜单需要看起来不同?

如果是这样的话,那么我会建议另一种方法。我认为 BlackBerry希望您执行此操作的方式是将MenuItem 对象正常添加到内置菜单Screen,但然后在类的方法中更改菜单的各种属性makeMenu()

protected void makeMenu(Menu menu, int context)
Run Code Online (Sandbox Code Playgroud)

以下是有关执行此操作的 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);
   }
}
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

注意:如果您只需支持 OS 6.0 及更高版本,您还有其他一些选择(请告诉我们)。另外,您编写自己的菜单的动机可能是因为您想更改字体颜色,我认为您无法使用上面显示的代码来做到这一点。再次强调,如果这是您设计的一部分,请告诉我们。谢谢。