2014-05-25 17 views
5

Nella mia app per Android voglio raccogliere statistiche su quando (quanto spesso) il menu della barra di azione di overflow (tre punti) viene aperto e chiuso (senza selezionare un elemento). Per questo compito ho superato i metodi onMenuOpened e onPanelClosed all'interno di uno Activity. Tuttavia, su tutti i dispositivi (Android 4.4, 4.2, Samsung e HTC) ho provato fino ad ora questi metodi vengono attivati ​​due volte, ogni volta che il menu viene aperto e chiuso. Si tratta di un bug? C'è un altro modo per monitorare questo menu di apertura e chiusura?Double callback onMenuOpened/onPanelClosed su ciascun pulsante del menu premere

risposta

6

si può provare questo ... ho provato .... funziona perfettamente ....

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    Activity activity = getActivity(); 
    activity.getActionBar().addOnMenuVisibilityListener(new OnMenuVisibilityListener() { 
    @Override 
     public void onMenuVisibilityChanged(boolean isVisible) { 
      // TODO Auto-generated method stub 
      //you can check the isVisible boolean to check 
      // if the overFlowMenu is visible or not 
     } 
    }); 
+0

@Leo K: si prega di votare la mia risposta, se u trovare utile –

+0

Si prega di cercare di migliorare la scrittura di vostra risposta. Inoltre, commentare il codice potrebbe aiutare. – fedorqui

+0

Accetterò la tua risposta. Tuttavia, vorrei aggiungere che ho già provato questo approccio in precedenza e che ha provocato lo stesso bug descritto nella domanda. Tuttavia, stavo impostando il listener su onCreateOptionsMenu, impostando il listener all'interno di onCreated invece risolto questo. In conclusione, questo approccio funziona. Inoltre, non sono proprio sicuro del motivo per cui hai suggerito di utilizzare il campo isOverflowMenuOpen, non è realmente necessario che il parametro isVisible fornisca le stesse informazioni. –

0

scoperto una soluzione migliore

public boolean onPrepareOptionsMenu(Menu menu) { 
     if (hasWindowFocus()) { 
     // gets called every time user taps on menu 
     Log.v(TAG, "onPrepareOptionsMenu - focus"); 
     } else { 
     // gets called when menu is being initialized 
     Log.v(TAG, "onPrepareOptionsMenu - NO FOCUS"); 
     } 
     return super.onPrepareOptionsMenu(menu); 
    } 

È possibile raccogliere le sue statistiche in la parte "messa a fuoco" dell'istruzione If.

1

ho avuto la stessa domanda, come voi, e trovare un modo più semplice per risolverlo:

Quando la prima volta che entra onMenuOpened(), menù è nullo. Il menu non è ancora pronto. Quindi, è possibile controllare come di seguito

@Override 
public boolean onMenuOpened(int featureId, Menu menu){ 
    if(menu!=null){ 
     //log something like firebaseLogEvent("Action", "onMenuOpened"); 
    } 
    return true; 

} 
Problemi correlati