2012-07-10 11 views
7

Sto usando ActionBarSherlock-4.1.0-0 e vorrei aprire il mio sottomenu nella barra delle azioni con il pulsante del menu hardware. Sto pianificando un aggiornamento e nella mia vecchia versione ho usato il menu "normale". Mi piacerebbe aiutare gli utenti ad abituarsi al nuovo design. Ho ottenuto il sottomenu e il menu principale:ActionBarSherlock: apre il sottomenu con il pulsante 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); 
    Menu mainMenu = menu; 
    return super.onCreateOptionsMenu(menu); 
} 

e ho ottenuto un listner al pulsante menu 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); 
} 

non riuscivo a trovare un metodo o qualsiasi altra cosa da chiamare. Spero che mi può aiutare, applausi, Paul

risposta

11

provo questa soluzione da Frederik con ActionBar Android e mi imbatto nel problema che il sottomenu si apre e si chiude immediatamente. Il passaggio a onKeyUp ha risolto questo problema.

Ecco il mio codice:

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

che faccio controllare se optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != null a causa di problemi di compatibilità con le versioni precedenti di Android senza ActionBar. Questo non è necessario se si utilizza ActionBarSherlock per tutte le versioni.

+4

Dovrebbe essere ACTION_UP, non ACTION_DOWN – kolobok

4

Ecco come ho risolto il problema

mainMenu.performIdentifierAction(id_of_menu_item, 0); 

Quindi nel tuo caso mi immagino che sarebbe come questo

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

In abbreviazione:

  • Memorizzare il menu in una variabile locale
  • utilizzare tale variabile per cercare il sottomenu
  • Utilizzare questa variabile per chiamare il metodo

Speriamo che questo funzionerà performIdentifierAction.

+0

Grazie per il supporto, ma quando implemento la soluzione, ottengo una java.lang.NullPointerException alla riga mainMenu.performIdentifierAction (subMenu.getItem(). GetItemId(), 0) ;. L'oggetto subMenu è nullo, qualche consiglio? – Spipau

+0

L'idea è che devi trovare l'ID oggetto del tuo sottomenu e usarlo. Qual è l'id del tuo ID di sottomenu? (The r.id. [theid])? Quello che faccio nella mia implementazione è di memorizzare il MenuItem in una var locale e usarlo per fare: getItemId(). –

+0

Vedere la mia risposta aggiornata. –

4

Ho sempre ottenuto NullPointerException con la soluzione di Fredrik Sundmyhr, poi ho cambiato alcune cose e ha funzionato. Ecco la mia soluzione:

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

applausi, Paul

Problemi correlati