2012-07-10 122 views
7

我使用的是ActionBarSherlock-4.1.0-0,我想用硬件菜单按钮在Actionbar中打开我的子菜单。我正在计划更新,而在旧版本中,我使用了“正常”菜单。我想帮助用户适应新的设计。 我得到了子菜单和主菜单:ActionBarSherlock:使用菜单按钮打开子菜单

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater i = getSupportMenuInflater(); 
    i.inflate(R.menu.main_menu, menu); 
    SubMenu subMenu = (SubMenu) menu.findItem(R.id.actionbar_submenu); 
    Menu mainMenu = menu; 
    return super.onCreateOptionsMenu(menu); 
} 

和我有一个听者硬件菜单按钮:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(event.getAction() == KeyEvent.ACTION_DOWN){ 
     switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      // TODO: expand submenu from actionbar 
      return true; 

     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 

我无法找到一个方法或其他任何来电。我希望你能帮助我, 欢呼声, 保罗

回答

11

我试着从弗雷德里克这个解决方案与Android动作条,我碰上的子菜单打开,并立即关闭问题。改为onKeyUp解决了这个问题。

这里是我的代码:

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_MENU){ 
     if (event.getAction() == KeyEvent.ACTION_DOWN && optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != null) 
     { 
      Log.i(TAG, "performIdentifierAction"); 
      optionsMenu.performIdentifierAction(R.id.sub_menu, 0); 
      return true; 
     } 
    } 
    return super.onKeyUp(keyCode, event); 
} 

我做检查,如果optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != null因为与旧的Android版本没有动作条的兼容性问题。如果您对所有版本使用ActionBarSherlock,这不是无关紧要的。

+4

它应该是ACTION_UP,而不是ACTION_DOWN – kolobok 2013-04-16 13:10:22

4

这是我如何解决这个问题

mainMenu.performIdentifierAction(id_of_menu_item, 0); 

所以你的情况我会想象它会是这样

private Menu mainMenu; // local variable for menu 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater i = getSupportMenuInflater(); 
    i.inflate(R.menu.main_menu, menu); 
    SubMenu subMenu = (SubMenu) menu.findItem(R.id.actionbar_submenu); 
    mainMenu = menu; // store the menu in an local variable 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(event.getAction() == KeyEvent.ACTION_DOWN){ 
     switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      SubMenu subMenu = (SubMenu) mainMenu.findItem(R.id.actionbar_submenu); 
      mainMenu.performIdentifierAction(subMenu.getItem().getItemId(), 0); 

      return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 

在简称:

  • 将菜单存储在本地变量中
  • 使用该变量来寻找子菜单
  • 使用该变量调用performIdentifierAction方法

希望这会工作。

+0

感谢您的支持,但是当我实现您的解决方案时,然后我在mainMenu.performIdentifierAction(subMenu.getItem()。getItemId(),0);处得到java.lang.NullPointerException异常。 subMenu对象为null,有何建议? – Spipau 2012-07-30 17:47:12

+0

这个想法是,你需要找到你的子菜单的项目ID并使用它。你的子菜单ID是什么? (r.id. [theid])?我在我的实现中做的是将MenuItem存储在本地var中,并使用它执行:getItemId()。 – 2012-07-30 18:59:31

+0

查看我的更新回答。 – 2012-07-30 19:08:59

4

我总是得到一个NullPointerException与Fredrik Sundmyhr的解决方案,然后我改变了一些东西,它的工作。这里是我的解决方案:

@Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if(event.getAction() == KeyEvent.ACTION_UP){ 
      switch(keyCode) 
      { 
      case KeyEvent.KEYCODE_MENU: 
       SubMenu subMenu = mainMenu.getItem(2).getSubMenu(); 
       mainMenu.performIdentifierAction(subMenu.getItem().getItemId(), 0); 

       return true; 
      } 
     } 
     return super.onKeyUp(keyCode, event); 
    } 

欢呼声, 保罗