9

Ho visto diverse segnalazioni di problemi in cui openOptionsMenu() non funziona su varie versioni di Android, come ad esempio:openOptionsMenu() non funziona in appcompat-v7 22.1.0 o più recente

openOptionsMenu() across android versions

openOptionsMenu() not working

ma il problema che ho sembra essere correlato alla versione della libreria di supporto appcompat-v7 utilizzata.

In sostanza, con le versioni più recenti di appcompat-v7 il menu apparirà bene quando openOptionsMenu() si chiama se la vostra attività si estende Attività ma non funziona se si estende ActionBarActivity o AppCompatActivity (vale a dire utilizzare la libreria di compatibilità). Nelle versioni precedenti di appcompat-v7 funziona perfettamente.

E 'riproducibile, come segue:

  1. In Android Studio, Import Sample 'ActionBarCompat-base'
  2. aggiungere un pulsante sullo schermo, che invoca openOptionsMenu()
  3. Si noti che ciò funziona, poiché nell'esempio è utilizzata la versione precedente della libreria, appcompat-v7: 21.0.3
  4. Modificare la dipendenza da utilizzare appcompat-v7: 23.0.1, ricompilare e quando si fa clic sul pulsante il menu sarà non.
  5. modificare l'attività principale di estendere attività (cioè senza applicazione compatibilità) - funziona
  6. modificare l'attività principale di estendere AppCompatActivity (vale a dire utilizzando la compatibilità app libarry) - non riesce

Dopo alcuni test, ho Ho scoperto che questo ha smesso di funzionare in appcompat-v7: 22.1.0 e non funzionerà più in nessuna versione più recente di questo jar.

Questo comportamento è identico sull'emulatore e su un dispositivo fisico e su Android versioni 5.1.1 (23) e 2.1 (7) che erano le due versioni con cui l'ho testato.

ho aggiunto un commento a questo bug: Android issue tracker bug

Eventuali suggerimenti, idee o soluzioni alternative apprezzato!

-Steve

+0

sto vivendo lo stesso problema :( –

risposta

3

Penso di avere effettivamente trovato una soluzione per questo.Consiste override del metodo openOptionsMenu():

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

Affinché showOverflowMenu() per funzionare su dispositivi con un tasto di menu fisica che sono al di sotto API 19, utilizzare questo: How to force action bar overflow icon to show

mActionBar è assegnato come tale:

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

Questo è il metodo 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; 
} 

Chiamare openOptionsMenu() da AppCompatActivity ora funziona!

NOTA: ho provato questo su API 26, ma visto che il metodo funziona getActionBar() molto inferiore a quello, non vedo alcuna ragione il resto di questo fallirà.

0

più semplice di posta del Vagabondo e va bene in genymotion e anche nel mio cellulare (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

Problemi correlati