2012-07-10 3 views
7

Я использую ActionBarSherlock-4.1.0-0, и я хотел бы открыть свое подменю в панели действий с помощью кнопки меню аппаратного обеспечения. Я планирую обновление, и в моей старой версии я использовал «нормальное» меню. Я хотел бы помочь пользователям привыкнуть к новому дизайну. я получил подменю и главного меню: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); 
} 

Я не мог найти способ или что-нибудь еще, чтобы позвонить. Я надеюсь, что вы можете мне помочь, приветствий, Paul

ответ

11

я пытаюсь это решение от Фредерика с андроид ActionBar и я бегу в проблему, которая открывается подменю и закрывается немедленно. Переход на 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 без ActionBar. Это не обязательно, если вы используете ActionBarSherlock для всех версий.

+4

Это должно быть ACTION_UP, а не ACTION_DOWN – kolobok

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

В short:

  • Хранить меню в локальной переменной
  • Используйте эту переменную, чтобы искать в подменю
  • Используйте эту переменную для вызова performIdentifierAction методу

Надеемся, что это будет работать.

+0

Спасибо за вашу поддержку, но когда я реализую ваше решение, я получаю java.lang.NullPointerException в строке mainMenu.performIdentifierAction (subMenu.getItem(). GetItemId(), 0) ;. Объект subMenu имеет значение null, любой совет? – Spipau

+0

Идея состоит в том, что вам нужно найти идентификатор элемента вашего подменю и использовать его. Каков идентификатор вашего идентификатора подменю? (R.id. [theid])? То, что я делаю в моей реализации, - это сохранить MenuItem в локальном var и использовать его: getItemId(). –

+0

См. Мой обновленный ответ. –

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

веселит, Пол

Смежные вопросы