6

我需要在我的黑莓应用程序中创建一个自定义菜单,以便我可以管理它的外观。我设法通过创建一个扩展 a 的类并将我的自定义菜单作为抽象方法来创建我的PopupScreenMenuItem定义LabelField菜单invokeAction()。我将该invokeAction()方法设为抽象以模拟 .run() 方法MenuItem

在此处输入图像描述

一切都很好,但我记得一些事情。如果我的老板让我实现MenuItemSwitch ApplicationClose这样的 native 怎么办。我不认为实现Close会是一个问题,但是Switch Application和其他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;
                }
            });
        }
    }

这是我的构造函数CustomMenu。我接受一个实例MainScreen作为我的参数来获取列表MenuItem并将其添加到我现有的CustomMenu. 被invokeAction()覆盖的方法是run()方法的对应物MenuItem。这是我所做的结果:

在此处输入图像描述

我设法将那些本机MenuItem放在我的CustomMenu但问题是当我调用(单击)那些本机MenuItem(切换应用程序,关闭)时,我得到了一个IllegalStateException. 有没有办法实现那些 native MenuItem?还是一种捕获方法的run()方法,MenuItem然后在 my 中调用它CustomMenu

4

2 回答 2

1

更新

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


原始答案

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

如果是这种情况,那么我会建议另一种方法。我认为黑莓希望你这样做的方式是将你的 MenuItem 对象添加到内置的 Menu 中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 回答
1

这些链接可能对您有所帮助

在 Blackberry 中创建 CUSTOM MENU(Blogspot)

在 Blackberry(WordPress) 中创建自定义菜单

于 2013-04-06T10:12:47.343 回答