2017-12-12 35 views
0

Ich versuche, einen Aktionsleisten-Menüeintrag für eine bestimmte Zeit auszublenden, während eine Aufgabe im Hintergrund ausgeführt wird activity.Änderung der Sichtbarkeit des Android-Menüelements in der Laufzeit

Zuerst in der onPrepareOptionsMenu Methode der Aktivität, ich die MenuItem Instanz als ein Feld abrufen.

Später benutze ich dieses Feld, um es unsichtbar und wieder sichtbar zu machen (mit der setVisible Methode).

Ich fragte mich, ob das ein guter Ansatz ist oder sollte ich irgendwie die invalidateOptionsMenu() verwenden, um es wieder sichtbar zu machen? Kann ich auf Nullzeiger-Ausnahmen stoßen?

Danke.

Antwort

1

Ich die MenuItem-Instanz als ein Feld abrufen. [...] Ich habe mich gefragt, ob das ein guter Ansatz ist, oder sollte ich irgendwie invalidateOptionsMenu() verwenden, um es wieder sichtbar zu machen?

Dies ist nicht der empfohlene Weg, um das zu tun, was Sie versuchen. Es ist besser, supportInvalidateOptionsMenu() zu verwenden, um onPrepareOptionsMenu() und ein boolean Feld oder eine Methode auszulösen, um zu überprüfen, um dann die Sichtbarkeit des Artikels direkt festzulegen.

Kann ich auf Nullzeigerausnahmen stoßen?

In neueren Versionen von Android, ist es möglich, onPrepareOptionsMenu() vor dem Menu über onCreateOptionsMenu() aufgeblasen wurde aufgerufen werden. Sie sollten also immer eine Nullprüfung der Ergebnisse von menu.findItem() durchführen oder anderweitig vor diesem Szenario schützen (z. B. indem Sie prüfen, ob menu.getSize() > 0).

+0

Vielen Dank für die Antwort. Sagen Sie, dass das MenuItem-Feld möglicherweise null wird? Wenn Sie das richtig verstehen, empfehlen Sie, ein boolesches Feld zu verwenden, um den Status des Menüelements zu überprüfen. – svahidhoss

+0

Ich würde es vermeiden, darüber so zu denken, dass Dinge "null" werden. Stellen Sie sich stattdessen Folgendes vor: Jedes Mal, wenn onPrepareOptionsMenu() 'ausgeführt wird, verfügen Sie über einige Menü- und Menüelemente, und Sie haben einen bestimmten Programmstatus. Holen Sie sich die Menüelemente, die Ihnen wichtig sind, mit 'menu.findItem()', prüfen Sie, ob sie nicht null sind, und aktualisieren Sie sie dann (z. B. 'item.setVisible()') basierend auf dem Programmstatus. Und ja, ich würde einen booleschen Wert verwenden ... etwas wie 'saveVisible = true; supportInvalidateOptionsMenu(); 'gefolgt von' MenuItem save = menu.findItem (R.id.save); if (speichern! = null) {save.setVisible (saveVisible); } ' –

+0

Ja, das ist, was ich getan habe! Verwenden eines Felds zum Überprüfen des Status (sichtbar/teilbar) und Aufrufen des invalidateOptionMenu, um das menuItem basierend auf diesem Feld zu aktualisieren, wenn dies erforderlich war. – svahidhoss

0
 // instance variable 
     public Menu option_Menu 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_container, menu); 
    option_Menu = menu; 
    option_Menu.findItem(R.id.skip).setVisible(false);  
    return super.onCreateOptionsMenu(menu); 
    } 

    // when task is completed you can show your menu just by calling this method 
    public void setMenuVisible(boolean visible, int id) { 
    if (option_Menu != null) { 
    option_Menu.findItem(id).setVisible(visible); 
    } 
} 
+0

Wie unterscheidet sich das, da Sie jetzt das Menü als ein Feld anstelle des MenuItem beibehalten? – svahidhoss

+0

Von meiner obigen Antwort haben Sie Menü-Objekt, von dem Sie die Methode setMenuVisible mit der entsprechenden Menüelement-ID aufrufen können, die Sie ausblenden oder anzeigen möchten – Lucky

0

Verwenden Sie diese Art und Weise

MenuItem menuItem = menu.findItem(R.id.menu_done);  
menuItem.setVisible(true); //visible 
menuItem.setVisible(false); //gone 
return true;` 
Verwandte Themen