2012-07-10 10 views
7

Estoy usando ActionBarSherlock-4.1.0-0 y me gustaría abrir mi submenú en la barra de acciones con el botón de menú de hardware. Estoy planeando una actualización y en mi versión anterior usé el menú "normal". Me gustaría ayudar a los usuarios a acostumbrarse al nuevo diseño. me dieron el submenú y el menú principal:ActionBarSherlock: abre el submenú con el botón de menú

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

y me dieron un listner al botón de menú de hardware:

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

no pude encontrar un método o cualquier otra cosa que llamar. Espero que me puedan ayudar, aplausos, Paul

Respuesta

11

de que este intento de solución Frederik con actionbar androide y yo con el problema de que el submenú se abre y se cierra inmediatamente. Cambiar a onKeyUp resolvió este problema.

Aquí está mi código:

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

que hacer Compruebe si optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != null debido a problemas de compatibilidad con versiones anteriores de Android sin actionbar. Esto no es necesario si usa ActionBarSherlock para todas las versiones.

+4

Debe ser ACTION_UP, no ACTION_DOWN – kolobok

4

Así es como he resuelto el problema

mainMenu.performIdentifierAction(id_of_menu_item, 0); 

Así, en su caso me imagino que sería así

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

En short:

  • Almacenar el menú en una variable local
  • Utilice esta variable para buscar el submenú
  • utilizar esa variable para llamar al método performIdentifierAction

Esperamos que esto va a funcionar.

+0

Gracias por su apoyo, pero cuando implemento su solución, obtengo una java.lang.NullPointerException en la línea mainMenu.performIdentifierAction (subMenu.getItem(). GetItemId(), 0) ;. El objeto subMenu es nulo, ¿algún consejo? – Spipau

+0

La idea es que necesita encontrar la identificación del ítem de su submenú y usar eso. ¿Cuál es el id de tu id del submenú? (The r.id. [theid])? Lo que hago en mi implementación es almacenar el MenuItem en una var local y usar eso para hacer: getItemId(). –

+0

Ver mi respuesta actualizada. –

4

Siempre recibí una NullPointerException con la solución de Fredrik Sundmyhr, luego cambié algunas cosas y funcionó. Aquí está mi solución:

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

aplausos, Paul

Cuestiones relacionadas