Ich verwende das neue android.support.design.widget.BottomNavigationView
aus der Support-Bibliothek. Wie kann ich die aktuelle Auswahl aus dem Code einstellen? Mir wurde klar, dass die Auswahl nach dem Drehen des Bildschirms wieder auf das erste Element geändert wird. Natürlich würde es auch helfen, wenn mir jemand sagen könnte, wie man den aktuellen Status BottomNavigationView
der onPause
Funktion "speichert" und wie man sie wiederherstellt onResume
.
Vielen Dank!
android
bottomnavigationview
Michael
quelle
quelle
BottomNavigationView
es wird kein interner Status gespeichert. Erwarten Sie wahrscheinlich, dass dies in einem zukünftigen Update enthalten sein wird. Duplizieren Sie (mit einigen weiteren Informationen) hier: stackoverflow.com/questions/40236786/…Antworten:
Ab API 25.3.0 wurde die Methode eingeführt, mit der
setSelectedItemId(int id)
Sie ein Element als ausgewählt markieren können, als ob es getippt worden wäre.Aus Dokumenten:
Codebeispiel:
WICHTIG
Sie MÜSSEN bereits alle Elemente zum Menü hinzugefügt haben (falls Sie dies programmgesteuert tun) und den Listener festlegen, bevor Sie setSelectedItemId aufrufen (ich glaube, Sie möchten, dass der Code in Ihrem Listener ausgeführt wird, wenn Sie diese Methode aufrufen). Wenn Sie setSelectedItemId aufrufen, bevor Sie die Menüelemente hinzufügen und den Listener einstellen, geschieht nichts.
quelle
onTabSelected
offensichtlich nicht definiert haben , wird es nichts tun. Lesen Sie die Dokumente -> Stellen Sie die ausgewählte Menüelement-ID ein. Dies verhält sich genauso wie das Tippen auf ein Element. Es ist von Android-EntwicklernUm programmgesteuert auf das Element BottomNavigationBar zu klicken, müssen Sie Folgendes verwenden:
Dadurch werden alle Elemente mit ihren Beschriftungen korrekt angeordnet.
quelle
Für diejenigen, die noch SupportLibrary <25.3.0 verwenden
Ich bin nicht sicher, ob dies eine vollständige Antwort auf diese Frage ist, aber mein Problem war sehr ähnlich - ich musste den
back
Tastendruck verarbeiten und den Benutzer zum vorherigen Tab bringen, auf dem er sich befand. Vielleicht ist meine Lösung für jemanden nützlich:Beachten Sie bitte, dass, wenn der Benutzer auf eine andere Navigationsregisterkarte drückt
BottomNavigationView
, das aktuell ausgewählte Element nicht gelöscht wird. Sie müssen diese Methode daheronNavigationItemSelected
nach der Verarbeitung der Navigationsaktion aufrufen :In Bezug auf das Speichern des Instanzstatus denke ich, dass Sie mit derselben
action id
Navigationsansicht spielen und eine geeignete Lösung finden könnten .quelle
Menu menu = bottomNavigationView.getMenu();
keine Kopie des Menüs zurück, sodass dasbottomNavigationView
Objekt nicht betroffen ist?Wo
action_item1
ist die Menüpunkt-ID?quelle
quelle
Seit der Version 25.3.0 ist es jetzt möglich,
setSelectedItemId()
\ o / aufzurufen .quelle
In
android:enabled="true"
zu BottomNavigationMenu Artikel.Und dann setzen
bottomNavigationView.setOnNavigationItemSelectedListener(mListener)
und setzen Sie es wie ausgewählt durch AusführenbottomNavigationView.selectedItemId = R.id.your_menu_id
quelle
Dies wird wahrscheinlich in den kommenden Updates hinzugefügt. In der Zwischenzeit können Sie jedoch Reflexion verwenden, um dies zu erreichen.
Erstellen Sie eine benutzerdefinierte Ansicht, die sich von BottomNavigationView aus erstreckt, und greifen Sie auf einige ihrer Felder zu.
Und dann verwenden Sie es in Ihrer XML-Layoutdatei.
quelle
Fügen Sie einfach eine andere Möglichkeit hinzu, um eine Auswahl programmgesteuert durchzuführen - dies war wahrscheinlich die Absicht an erster Stelle, oder vielleicht wurde dies später hinzugefügt.
Das
performIdentifierAction
nimmt eineMenu
Artikel-ID und eine Flagge.Weitere Informationen finden Sie in der Dokumentation .
quelle
Scheint in SupportLibrary 25.1.0 behoben zu sein :) Bearbeiten: Es scheint behoben zu sein, dass der Status der Auswahl beim Drehen des Bildschirms gespeichert wird.
quelle
Oberhalb von API 25 können Sie setSelectedItemId (menu_item_id) verwenden, aber unter API 25 müssen Sie das Benutzermenü anders ausführen, um das Handle zu erhalten, und dann setChecked to Checked spezifisches Element
quelle
Ich möchte Ihren Code nicht ändern. Wenn ja, empfahl ich Ihnen zu versuchen BottomNavigationViewEx .
Sie müssen nur ersetzen, eine Methode aufrufen
setCurrentItem(index);
undgetCurrentItem()
。quelle
Verwenden Sie diese Option, um den ausgewählten unteren Navigationsmenüpunkt anhand der Menü-ID festzulegen
quelle
Ich habe Google einen Fehler gemacht, weil es keine zuverlässige Möglichkeit gibt, die Seite in einer BottomNavigationView auszuwählen: https://code.google.com/p/android/issues/detail?id=233697
NavigationView hatte anscheinend ein ähnliches Problem, das durch Hinzufügen einer neuen setCheckedItem () -Methode behoben wurde.
quelle
Sie können die performClick-Methode ausprobieren:
quelle
verwenden
quelle
Das einzige "Minus" der Lösung ist die Verwendung
MenuItemImpl
, die für die Bibliothek "intern" ist (obwohl öffentlich).quelle
WENN SIE FRAGMENTARGUMENTE DYNAMISCH PASSIEREN MÜSSEN, TUN SIE DAS
Es gibt hier viele (meist wiederholte oder veraltete) Antworten, aber keine von ihnen erfüllt ein sehr häufiges Bedürfnis: Dynamische Übergabe verschiedener Argumente an das in eine Registerkarte geladene Fragment .
Sie können verschiedene Argumente nicht dynamisch an das geladene Fragment übergeben
setSelectedItemId(R.id.second_tab)
, indem Sie das statische Element aufrufenOnNavigationItemSelectedListener
. Um diese Einschränkung zu überwinden, habe ich dies in meinemMainActivity
Ordner getan , der die folgenden Registerkarten enthält:Die
ArticleFragment.newInstance()
Methode wird wie gewohnt implementiert:quelle
ich hoffe das hilft
Es geht eher darum, das Standardfragment zu bestimmen, das gleichzeitig mit dem entsprechenden unteren Navigationsmenüpunkt geladen wird. Sie können dasselbe in Ihre OnResume-Rückrufe aufnehmen
quelle
Diese Methode funktioniert bei mir.
quelle
Reflexion ist eine schlechte Idee.
Gehen Sie zu diesem Kern . Es gibt eine Methode, die die Auswahl durchführt, aber auch den Rückruf aufruft:
quelle
callOnClick()
stattdessenperformClick()
, auf diese Weise muss ich den Sound nicht deaktivieren, wasperformClick()
sowieso nicht funktioniert hat.