Holen Sie sich ein MenuItem
Zeige auf solche Artikel, rufen Sie setVisible
auf, ihre Sichtbarkeit zu justieren und rufen Sie dann invalidateOptionsMenu()
auf Ihre Tätigkeit so das ActionBar Menü entsprechend angepasst wird.
Update: A MenuItem
ist keine reguläre Ansicht, die Teil Ihres Layouts ist. Es ist etwas Besonderes, ganz anders. Ihr Code kehrt null
für zurück item
und das verursacht den Absturz. Was Sie stattdessen brauchen, ist zu tun:
MenuItem item = menu.findItem(R.id.addAction);
Hier ist die Reihenfolge, in der Sie aufrufen sollten: Rufen Sie zuerst auf invalidateOptionsMenu()
und erhalten Sie dann im Inneren onCreateOptionsMenu(Menu)
einen Verweis auf das MenuItem (durch Aufrufen menu.findItem()
) und rufen Sie setVisible()
es auf
MenuItem
kann diesnull
daran liegen , dass SiegetItem
anstelle von verwendenfindItem
. Wir könnten es nie erfahren, ohne sowohl Ihren Code als auch Ihr Absturzprotokoll zu sehen.onCreateOptionsMenu
unter und stellen Sie die Sichtbarkeit des Elements an diesem Punkt ein. Oder bewahren Sie die Referenz so lange auf, bis Sie entscheiden, ob sie sichtbar sein soll oder nicht.invalidateOptionsMenu()
und dann im InnerenonCreateOptionsMenu(Menu)
einen Verweis auf dasMenuItem
(durch Aufrufenmenu.findItem()
) zu erhalten und es aufzurufensetVisible()
. Die Antworten von suhas_sm und von P1r4nh4 zeigen den richtigen Ansatz.Einen Nachtrag zu dieser Frage gefunden:
Wenn Sie die Sichtbarkeit Ihrer Menüelemente unterwegs ändern möchten, müssen Sie lediglich eine Mitgliedsvariable in Ihrer Aktivität festlegen, um sich daran zu erinnern, dass Sie das Menü
invalidateOptionsMenu()
ausblenden und die Elemente in Ihrer überschriebenenonCreateOptionsMenu(...)
Methode aufrufen und ausblenden möchten .In meinem Beispiel habe ich alle Elemente ausgeblendet.
quelle
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
Folgendes tun: In den Dokumenten heißt es: "Sie müssen true zurückgeben, damit das Menü angezeigt wird. Wenn Sie false zurückgeben, wird es nicht angezeigt."onPrepareOptionsMenu()
sollte für die Ein- / Ausblendlogik verwendet werden, anstattonCreateOptionsMenu()
nur einmal aufgerufen zu werden. Dies ist daher nicht sinnvoll, wenn Sie die Menüelemente nach der Initialisierung ändern möchten. Also in onCreate aufblasen, aber in onPrepare ein- / ausblenden.Ja.
invalidateOptionsMenu()
Sie an, wenn Sie die Option ausblenden möchten. Dies wird anrufenonCreateOptionsMenu()
.onCreateOptionsMenu()
, Check für die Flagge / Zustand und zeigen oder verstecken sie die folgende Art und Weise:quelle
invalidateOptionsMenu
statt seininvalidateOptions
?onCreateOptionsMenu
Sie können dies nennen:
Aktualisieren:
Stellen Sie sicher, dass Ihr Code nicht
null
für zurückgegeben wird,item
da sonst die Anwendung abstürzen kann.quelle
Ich suchte nach einer Antwort mit etwas mehr Kontext. Nachdem ich es herausgefunden habe, werde ich diese Antwort hinzufügen.
Schaltfläche im Menü XML standardmäßig ausblenden
Standardmäßig wird die Freigabeschaltfläche ausgeblendet, wie von festgelegt
android:visible="false"
.main_menu.xml
Schaltfläche im Code anzeigen
Die Schaltfläche "Teilen" kann jedoch optional unter bestimmten Bedingungen angezeigt werden.
MainActivity.java
Siehe auch
quelle
invalidateOptionsMenu()
zum Aktualisieren des Menüs verwenden.hat bei mir nicht funktioniert. Ich musste explizit verwenden
onPrepareOptionsMenu
, um einen Gegenstand unsichtbar zu machen.Verwenden Sie
onCreateOptionsMenu
diese Option, um das Menü zu erstellen undonPrepareOptionsMenu
die Sichtbarkeit usw. zu ändern.quelle
onPrepareOptionsMenu
scheint dies der richtige Ort für diese Art von Operation zu sein: "Bereiten Sie das Standardoptionsmenü des Bildschirms für die Anzeige vor. Dies wird jedes Mal aufgerufen, bevor das Menü angezeigt wird Mit dieser Methode können Sie Elemente effizient aktivieren / deaktivieren oder den Inhalt auf andere Weise dynamisch ändern. "invalidateOptionsMenu()
das Menü aktualisieren .Setzen Sie die Sichtbarkeit des Menüelements in der Menülayoutdatei zunächst wie folgt auf false:
Sie können dann einfach die Sichtbarkeit des Menüelements in Ihrem onCreateOptionsMenu () auf false setzen, nachdem Sie das Menü aufgeblasen haben.
quelle
Versuche dies:
quelle
Dies funktionierte sowohl für Activity als auch für Fragment
quelle
P1r4nh4 Antwort funktioniert gut, ich habe es nur mit einem booleschen Flag vereinfacht:
quelle
0
und1
ist kein "Boolesches Flag", sondern ein Pseudo-Boolesches. Außerdem gibt es hier keinen Grund, einen tatsächlichen Booleschen Wert zu verwenden.Laut der offiziellen Website von Android Developer wird OnCreateOptionMenu (Menü Menü) nicht zum Ändern von Menüelementen oder Symbolen, Sichtbarkeit usw. zur Laufzeit empfohlen.
Wie empfohlen Sie können dies verwenden onOptionsItemSelected- Methode (MenuItem-Element) verwenden, um Benutzereingaben zu verfolgen.
Wenn Sie Menüelemente zur Laufzeit ändern müssen, können Sie sie mit onPrepareOptionsMenu (Menü Menü) ändern
quelle
setVisible(false)
für das immer sichtbare Element bin, verschwindet es nicht, bis ich auf die drei Punkte klicke (Menü selbst). Wenn ichinvalidateOptionsMenu()
inonPrepareOptionsMenu
den Elementen verwende, reorganisiere ich mich sofort, aber sie verlieren ihre Aktionen (wenn ich auf ein Element klicke, tut es nichts).Setzen Sie einen Wert auf eine Variable und rufen Sie invalidateOptionsMenu () auf.
zum Beispiel
quelle
setVisible(false)
für das immer sichtbare Element bin, verschwindet es nicht, bis ich auf die drei Punkte klicke (Menü selbst). Wenn ichinvalidateOptionsMenu()
inonPrepareOptionsMenu
den Elementen verwende, reorganisiere ich mich sofort, aber sie verlieren ihre Aktionen (wenn ich auf ein Element klicke, tut es nichts).Sie können
toolbar.getMenu().clear();
damit alle Menüelemente gleichzeitig ausblendenquelle
Durch Einstellen der Sichtbarkeit aller Elemente im Menü wird das Appbar-Menü oder das Überlaufmenü automatisch ausgeblendet
Beispiel
...
...
Bevor Sie zu einem anderen Fragment wechseln, verwenden Sie den folgenden Code:
quelle
https://stackoverflow.com/a/21215280/466363 - beantwortet von Look Alterno und Sufian
.
ActivityCompat.invalidateOptionsMenu () ruft onPrepareOptionsMenu () nicht zurück; es aktualisiert einfach das Menü direkt.
Meine someMethod () wird von mehreren Stellen aufgerufen, sogar vor onCreateOptionsMenu (), daher muss ich mMenu! = Null überprüfen.
quelle
Wenn Sie alles wie in den obigen Antworten ausgeführt haben, aber ein Menüelement weiterhin sichtbar ist, überprüfen Sie, ob Sie auf die eindeutige Ressource verweisen . Zum Beispiel in onCreateOptionsMenu oder onPrepareOptionsMenu
Strg + Klicken Sie auf R.id.menu_open und überprüfen Sie, ob es nur in einer Menüdatei vorhanden ist. Falls diese Ressource bereits irgendwo verwendet und in eine Aktivität geladen wird, wird versucht, sie dort auszublenden.
quelle
Der beste Weg, um alle Elemente in einem Menü mit nur einem Befehl auszublenden, ist die Verwendung von "group" in Ihrer Menü-XML. Fügen Sie einfach alle Menüelemente, die sich in Ihrem Überlaufmenü befinden, innerhalb derselben Gruppe hinzu.
In diesem Beispiel haben wir zwei Menüelemente, die immer angezeigt werden (reguläres Element und Suche) und drei Überlaufelemente:
Verwenden Sie dann für Ihre Aktivität (vorzugsweise bei onCreateOptionsMenu) den Befehl setGroupVisible, um die Sichtbarkeit aller Menüelemente auf false oder true zu setzen.
Wenn Sie diesen Befehl an einer anderen Stelle in Ihrer Aktivität verwenden möchten, müssen Sie die Menüklasse lokal speichern und immer überprüfen, ob das Menü null ist, da Sie es vor createOptionsMenu ausführen können:
quelle
Für Benutzer der Appcompat-Bibliothek: Wenn Ihre Aktivität ActionBarActivity untergeordnet ist, können Sie supportInvalidateOptionsMenu () aufrufen.
Hier zu sehen: https://stackoverflow.com/a/19649877/1562524
quelle
Ich denke, ein besserer Ansatz wäre, eine Mitgliedsvariable für das Menü zu verwenden, sie in onCreateOptionsMenu () zu initialisieren und anschließend einfach setVisible () zu verwenden, ohne das Optionsmenü ungültig zu machen.
quelle
Dieser Code hat bei mir funktioniert
quelle
Dieser Ansatz hat bei mir funktioniert:
quelle
Sie versuchen, über eine Aktivität, die keinen Zugriff auf den Bereich hat, auf einen Menüpunkt zuzugreifen. Der Aufruf zum Suchen des Menüelements gibt null zurück , da die Ansicht weder an die Aktivität noch an das Layout gebunden ist ist, von Sie anrufen.
Die Menüelemente sind mit Elementen wie " Navigationsleiste " verbunden, die wiederum mit der entsprechenden Aktivität verknüpft sind.
Initialisieren Sie diese Ansichten in activity () und greifen Sie dann mit diesen Ansichten auf die Menüelemente zu.
quelle
verwenden
invalidateOptionsMenu()
um anzurufen
onPrepareOptionsMenu(menu: Menu?)
https://developer.android.com/guide/topics/ui/menus
quelle
quelle