9

ich mehrere Berichte über Probleme gesehen haben, wo openOptionsMenu() werden auf verschiedenen Android-Versionen arbeiten, zB:openOptionsMenu() wird in appcompat-v7 nicht funktionieren 22.1.0 oder neuer

openOptionsMenu() across android versions

openOptionsMenu() not working

aber das Problem, das ich habe, scheint mit der Version der appcompat-v7-Support-Bibliothek verwandt zu werden.

Im Wesentlichen mit den neueren Versionen von AppCompat-v7 wird das Menü Fein angezeigt, wenn openOptionsMenu() aufgerufen, wenn Ihre Tätigkeit erstreckt Aktivität wird aber nicht funktionieren, wenn Sie ActionBarActivity oder AppCompatActivity verlängern (dh verwenden Sie die Kompatibilitätsbibliothek). In älteren Versionen von appcompat-v7 funktioniert es gut.

Es ist reproduzierbar, wie folgt:

  1. In Android Studio, Import Sample 'ActionBarCompat-Basic'
  2. eine Schaltfläche, um den Bildschirm hinzufügen, die openOptionsMenu()
  3. Hinweis aufruft, Dies funktioniert gut, wie die alte Version der Bibliothek, appcompat-v7: 21.0.3 im Beispiel verwendet wird
  4. Ändern Sie die Abhängigkeit zu verwenden appcompat-v7: 23.0.1, neu aufzubauen, und wenn Sie auf die Schaltfläche das Menü klicken wird nicht erscheinen.
  5. ändert die Haupttätigkeit Aktivität zu verlängern (dh keine App-Kompatibilität) - es funktioniert
  6. ändert die Haupttätigkeit AppCompatActivity zu erweitern (dh App-Kompatibilität libarry verwenden) - es scheitert

Nach einigen Tests, ich habe festgestellt, dass dies in appcompat-v7: 22.1.0 nicht mehr funktioniert und nicht mehr in einer neueren Version dieses JARs funktioniert.

Dieses Verhalten ist auf dem Emulator und einem physischen Gerät identisch und auf den Android-Versionen 5.1.1 (23) und 2.1 (7), mit denen ich die beiden Versionen getestet habe.

Ich habe einen Kommentar zu diesem Fehler hinzugefügt: Android issue tracker bug

Irgendwelche Vorschläge, Ideen oder geschätzt Abhilfen!

-Steve

+0

Ich erlebe den gleichen Fehler :( –

Antwort

3

Ich denke, dass ich gefunden habe, kann tatsächlich eine Abhilfe für dieses.Es geht um das Überschreiben der openOptionsMenu() Methode:

@Override 
public void openOptionsMenu() 
{ 
    mActionBar.showOverflowMenu(); 
} 

Damit showOverflowMenu() auf Geräten mit einem physikalischen Menütaste zu arbeiten, die unter 19 API sind, verwenden diese: How to force action bar overflow icon to show

mActionBar als solche zugeordnet:

android.support.v7.widget.Toolbar mActionBar = (android.support.v7.widget.Toolbar) getActionBar(getWindow().getDecorView()) 

Dies ist die getActionBar() Methode:

public static ViewGroup getActionBar(View view) 
{ 
    try 
    { 
     if (view instanceof ViewGroup) 
     { 
      ViewGroup viewGroup = (ViewGroup) view; 

      if (viewGroup instanceof android.support.v7.widget.Toolbar) 
      { 
       return viewGroup; 
      } 

      for (int i = 0; i < viewGroup.getChildCount(); i++) 
      { 
       ViewGroup actionBar = getActionBar(viewGroup.getChildAt(i)); 

       if (actionBar != null) 
       { 
        return actionBar; 
       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return null; 
} 

Aufruf von openOptionsMenu() von einer AppCompatActivity funktioniert jetzt!

HINWEIS: Ich testete dies auf API 26, aber da die getActionBar() Methode weit unter diesem funktioniert, sehe ich keinen Grund, der Rest dieser wird fehlschlagen.

0

einfacher als die Post Wanderer und es geht in genymotion Fein- und auch in meinem Handy (Eibisch):

import android.support.v7.widget.Toolbar; 

//btMainMenu is a button 
public void btMainMenu_click(View view) { 
    final View view2 = getWindow().getDecorView().findViewById(R.id.action_bar); 
    if (view2 instanceof Toolbar) { 
     ((Toolbar) view2).showOverflowMenu(); 
    } 
    else { 
     System.out.println("What a pity!, it doesn't work..., view2 is not toolbar"); 
    } 
} 

https://issuetracker.google.com/issues/37060139