Navigation-Architektur Komponenten - Passing argument der startDestination
Habe ich eine Aktivität Ein, die start-activity B übergeben Sie einige mit der Absicht, Daten. Aktivität B host a navigation Grafik aus dem neuen Navigations-Architektur-Komponente.Möchte ich weitergeben, dass die Absicht, Daten der startDestination fragment als argument, wie zu tun?
- Ich bin mir ziemlich sicher, dass der Navigations-editor bietet Optionen für "Argumente" und dann können Sie die sicher-args gradle plugin, aber die details sind ein wenig verschwommen für mich atm
- Ja, ich weiß, aber es gibt keine Möglichkeit, Argumente an die start-Ziel-fragment
InformationsquelleAutor Ahmed Abd-Elmeged | 2018-05-14
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
TLDR: Man muss manuell Blasen Sie das Diagramm, fügen Sie das Schlüssel/Werte, um die defaultArgs, und legen Sie das Diagramm auf der
navController
.Schritt 1
In der Dokumentation erzählt Sie den Graphen in der
<fragment>
tag in IhremActivity
's layout. So etwas wie:ENTFERNEN Sie die Zeile Einstellung der
graph=
.Schritt 2
In der Aktivität, die mit Ihren
NavHostFragment
, Blasen Sie das Diagramm etwa so:Wo
navFragment
ist die id, die Sie gab Ihr ein fragment in XML, wie oben beschrieben.Schritt 3 [Entscheidend!]
Ein bundle erstellen möchten, halten Sie die Argumente, die Sie weitergeben wollen an Ihre
startDestination
- fragment und fügen Sie dem Diagramm die Standard-Argumente:Schritt 4
Legen Sie das Diagramm auf der host -
navController
:addDefaultArgument
Funktion wurde entfernt.Hatte es behoben wurde, in
1.0.0-alpha07
. Siehe detail.Die Lösung ist ähnlich der Elliot Schrock Antwort, sondern Umhüllung durch die offizielle API.
Müssen wir manuell aufblasen
NavHostFragment
odergraph
Verwenden
Oder
Den args sind die Daten, die wir weitergeben wollen zu start-Ziel.
OK, ich habe eine Lösung gefunden für das problem Dank Ian Lake aus dem Google-team.
Lassen Sie sagen, Sie haben Eine Aktivität, die wird, die die Aktivität B mit einige mit der Absicht, die Daten, und Sie wollen, dass die Daten in der startDestination Sie haben hier zwei Optionen, wenn Sie mit den safe-args, das ist mein Fall könnten Sie tun
StartFragmentArgs.fromBundle(requireActivity().intent?.extras)
Lesen die Argumente von der Absicht. Wenn Sie nicht sicher args können Sie extrahieren die Daten aus dem Bündel Ihrer selbst-mit
requireActivity().intent?.extras
wird wieder ein Bundle, das Sie verwenden können, statt das fragmentgetArguments()
Methode. Das ist es, ich versuche es und alles funktioniert.StartFragmentArgs
Klasse kommt? Ist es enthalten in der navigation arch Abhängigkeit?requireActivity().intent?.extras
Ich denke, das hat sich wieder verändert mit der 1.0.0 Version. Und Google hat Sie versteckte sich diese Informationen sehr gut in der offiziellen Dokumentation. Oder zumindest habe ich gekämpft, um es zu finden, aber stolperte über es in der zu Migrieren, um die Navigation-Komponente guide. Wie übergibt man Argumente an die start-Ziel wird hier erwähnt:
https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment
Kurz
Update: Google hat gesagt, dass die offizielle Dokumentation für die übergabe von Argumenten an die erste Navigations-Ziel tatsächlich fehlt. Hoffentlich wird Hinzugefügt, sobald ein Teil der Navigations-Komponente-Dokumentation.
Also für die Menschen Noch mit diesen zu kämpfen. Ich fand einen anderen Weg, dies zu tun, ohne über Sichere Argumente und ein Schritt mit @Elliot ' s Antwort.
So können sagen, Sie haben einige Argumente in Aktivität B Aktivität A und Ihre Aktivität B hat ein fragment startDestination Sie sind Initialisierung des Nav-controller wie diesem:
aus der Nav-Controller haben Sie Zugriff auf Ihre Grafik, die Sie gesetzt haben, in die XML wie diese, und Sie können die Argumente in der defaultArguments:
Hinweis: wird das update auch Werte der Schlüssel, wenn es schon vorhanden ist in der Grafik-xml -
Nun in Ihrem Fragment zu finden, die default-Argumente aus Ihrem NavHostFragment wie diese:
werden und Sie haben die Werte dort. Ich weiß nicht, warum @Elliot denkt, es ist entscheidend, sondern es sollte der Weg sein?
UPDATE alpha09:
addDefault argument wird nicht mehr unterstützt in dieser version, die Sie verwenden müssen, NavArgument
In der Zeit des Schreibens dieser Antwort, ich bin mit
Navigation 2.2.0-alpha01
Wenn Sie möchten, dass einige Daten auf die start-Ziel-direkt als Argumente von host Tätigkeit, müssen Sie manuell auf dem host-graph navigation innerhalb der host-activity onCreate () - Methode, wie unten dargestellt:
Erhalten Sie navController:
Dann in die host-Aktivität
onCreate()
Oder, wenn Sie wollen, passieren die Absicht extras, wie es um die startDestination:
Seit
intent.extras
zurückkehren würde eineBundle
nurBeim Lesen dieser Argumente in Ihrem startDestination fragment:
Wenn Sie die Sicher Args Plugin (das ist sehr empfehlenswert), dann in Ihrem fragment:
Sicher Args plugin erzeugen würde eine Args-Klasse durch Anhängen von Args zu Ihrem fragment-Namen. Wenn Sie beispielsweise das fragment genannt wird
DummyFragment
dann Sicher Args würden, erzeugen Sie eine Klasse namensDummyFragmentArgs
wo
navArgs<>
ist eine Erweiterung definierte Funktion Android-KTXWenn Sie nicht mit Android KTX, können Sie das args-Objekt wie:
Sobald Sie erworben haben, das arguments-Objekt, können Sie einfach Holen Sie Ihre Argumente:
Beachten Sie, wie wir an
"some_argument"
als argument, und wir Lesen es alssomeArgument
mit Safe-ArgsWenn Sie nicht Sicher Args (es gibt keinen Grund, es nicht verwenden, wenn), können Sie den Zugriff auf Ihre Argumente wie diese:
All dies ist dokumentiert in der Migration auf die Navigation-Komponente-Dokumentation hier:
https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment
addDefaultArguments ist nicht mehr in den neuesten Versionen der Bibliothek. Ich habe das problem behoben, wie diese: