我正在使用ActionBarSherlock-4.1.0-0,我想使用硬件菜单按钮在Actionbar中打开我的子菜单。我正在计划更新,在我的旧版本中,我使用了“普通”菜单。我想帮助用户习惯新设计。 我得到了子菜单和主菜单:
@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);
}
我找不到要调用的方法或其他任何内容。我希望你能帮帮我, 干杯, 保罗
答案 0 :(得分:11)
我尝试使用android操作栏从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,则这不是必须的。
答案 1 :(得分: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
方法希望这会奏效。
答案 2 :(得分: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);
}
欢呼声, 保罗