2012-07-10 6 views
7

Ich benutze ActionBarSherlock-4.1.0-0 und ich möchte mein Untermenü in der Aktionsleiste mit der Hardware-Menü-Taste öffnen. Ich plane ein Update und in meiner alten Version habe ich das "normale" Menü benutzt. Ich möchte den Nutzern helfen, sich an das neue Design zu gewöhnen. Ich habe das Untermenü und das Hauptmenü:ActionBarSherlock: öffnen Sie das Untermenü mit Menü-Taste

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

und ich habe einen listner auf die Hardware-Menü-Taste:

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

ich kein Verfahren oder irgendetwas anderes zu nennen finden konnte. Ich hoffe, dass Sie mir helfen können, prost, Paul

Antwort

11

ich versuchen, diese Lösung von Frederik mit Android ActionBar und ich laufe in das Problem, dass das Untermenü öffnet und schließt sofort. Der Wechsel zu onKeyUp hat dieses Problem gelöst.

Hier ist mein Code:

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

ich überprüfen, ob optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != null wegen Kompatibilitätsprobleme mit älteren Android-Versionen ohne ActionBar. Dies ist nicht erforderlich, wenn Sie ActionBarSherlock für alle Versionen verwenden.

+4

Es sollte ACTION_UP, nicht ACTION_DOWN sein – kolobok

4

Dies ist, wie ich das Problem gelöst

mainMenu.performIdentifierAction(id_of_menu_item, 0); 

Also in Ihrem Fall würde ich mir vorstellen, es wie dieses

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

wäre in kurz:

  • Speichern Sie das Menü in einer lokalen Variablen
  • diese Variable Verwenden Sie für das Untermenü
  • Verwenden Sie diese Variable suchen, um die performIdentifierAction Methode

Hoffentlich arbeiten zu nennen.

+0

Vielen Dank für Ihre Unterstützung, aber wenn ich Ihre Lösung implementieren, dann bekomme ich eine java.lang.NullPointerException at line mainMenu.performIdentifierAction (subMenu.getItem(). GetItemId(), 0) ;. Das SubMenu-Objekt ist null, irgendein Ratschlag? – Spipau

+0

Die Idee ist, dass Sie die Artikel-ID Ihres Untermenüs finden und verwenden müssen. Wie lautet die ID Ihrer Submenü-ID? (The r.id. [theid])? Was ich in meiner Implementierung mache, ist, das MenuItem in einer lokalen Variablen zu speichern und zu verwenden: getItemId(). –

+0

Siehe meine aktualisierte Antwort. –

4

Ich bekam immer eine NullPointerException mit der Lösung von Fredrik Sundmyhr, dann änderte ich ein paar Dinge und es funktionierte. Hier ist meine Lösung:

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

prost, Paul

Verwandte Themen