7

我正在使用 ActionBarSherlock-4.1.0-0,我想用硬件菜单按钮在操作栏中打开我的子菜单。我正在计划更新,在我的旧版本中,我使用了“普通”菜单。我想帮助用户习惯新的设计。

我得到了子菜单和主菜单:

@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);
}

我找不到要调用的方法或其他任何东西。

4

3 回答 3

11

我用 android actionbar 尝试了 Frederik 的这个解决方案,我遇到了子菜单立即打开和关闭的问题。更改为 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,这不是必需的。

于 2012-11-20T14:19:04.190 回答
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方法

希望这会奏效。

于 2012-07-24T18:01:07.403 回答
4

在 Fredrik Sundmyhr 的解决方案中,我总是得到一个 NullPointerException,然后我改变了一些东西并且它起作用了。这是我的解决方案:

@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);
    }
于 2012-10-07T19:39:18.600 回答