9

Widziałem kilka raportów o kwestiach, w których openOptionsMenu() nie będzie działać na różnych wersjach Androida, np:openOptionsMenu() nie będzie działać w AppCompat-v7 22.1.0 lub nowszy

openOptionsMenu() across android versions

openOptionsMenu() not working

ale wydaje się, że problem jest związany z wersją używanej biblioteki pomocy appcompat-v7.

W istocie, z nowszymi wersjami AppCompat-v7 menu będą wyświetlane poprawnie, gdy openOptionsMenu() nazywa jeśli aktywność rozciąga Aktywny ale nie będzie działać, jeśli przedłużyć ActionBarActivity lub AppCompatActivity (tj. skorzystaj z biblioteki kompatybilności). W starszych wersjach appcompat-v7 działa dobrze.

To jest powtarzalny, co następuje:

  1. W Android Studio, import Sample 'ActionBarCompat elitarny'
  2. Dodaj przycisk na ekranie, który wywołuje openOptionsMenu()
  3. Należy pamiętać, że działa to dobrze, ponieważ starsza wersja biblioteki, appcompat-v7: 21.0.3, jest używana w próbce
  4. Zmień zależność, aby użyć appcompat-v7: 23.0.1, przebudować, a po kliknięciu przycisku menu będzie nie pojawi się.
  5. Zmień główną działalność rozszerzyć aktywność (czyli nie app kompatybilność) - działa
  6. zmienić główne aktywności przedłużyć AppCompatActivity (czyli używając kompatybilności aplikacji libarry) - to nie

Po kilku testach, ja Zauważyliśmy, że przestało to działać w appcompat-v7: 22.1.0 i nie będzie działało w żadnej nowszej wersji tego słoika.

To zachowanie jest identyczne na emulatorze i fizycznym urządzeniu, a na wersjach Androida 5.1.1 (23) i 2.1 (7) dwie wersje, z którymi go przetestowałem.

Dodałem komentarz do tego błędu: Android issue tracker bug

jakieś sugestie, pomysły lub obejścia doceniane!

-Steve

+0

mam przeżywa ten sam błąd :( –

Odpowiedz

3

myślę, że może mam faktycznie znaleźli obejście tego.Polega ona na nadpisanie metody openOptionsMenu():

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

Aby showOverflowMenu() do pracy na urządzeniach z fizycznego przycisku menu, które są poniżej API 19, użyj tego: How to force action bar overflow icon to show

mActionBar jest przypisany jako takie:

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

jest to metoda getActionBar():

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

Dzwonienie pod numer openOptionsMenu() z AppCompatActivity działa!

UWAGA: Przetestowałem to na API 26, ale widząc jak metoda getActionBar() pracuje znacznie poniżej, że nie widzę powodu, reszta to zakończy się niepowodzeniem.

0

bardziej proste niż postu wędrowiec i idzie dobrze w genymotion a także w moim telefonie komórkowym (marshmallow):

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

Powiązane problemy