Die Komponente „Navigation“ enthält ein NavigationUI
. Diese Klasse enthält statische Methoden, die die Navigation mit der obersten
App-Leiste, der Navigationsleiste und der Navigation am unteren Rand.
Obere App-Leiste
Über die obere App-Leiste bietet eine einheitliche Stelle oben in Ihrer App für die Anzeige von Informationen und Aktionen auf dem aktuellen Bildschirm.
<ph type="x-smartling-placeholder">NavigationUI
enthält Methoden, mit denen Inhalte in deinen Top-Inhalten automatisch aktualisiert werden
App-Leiste, während Nutzer durch Ihre App navigieren. NavigationUI
verwendet beispielsweise den Parameter
aus dem Navigationsdiagramm aus, damit der Titel der Top-App
aktuell halten.
<navigation> <fragment ... android:label="Page title"> ... </fragment> </navigation>
Wenn Sie NavigationUI
mit den Implementierungen der oberen App-Leiste verwenden, die unten beschrieben werden,
Das Label, das Sie den Zielen hinzufügen, kann automatisch über die
Argumente, die unter Verwendung des Formats {argName}
in Ihrem
.
NavigationUI
unterstützt die folgenden oberen App-Leistentypen:
Weitere Informationen zu App-Leisten finden Sie unter App-Leiste einrichten.
AppBar-Konfiguration
NavigationUI
verwendet ein AppBarConfiguration
-Objekt, um das Verhalten der Navigationsschaltfläche in der oberen linken Ecke zu verwalten.
Flächeninhalts Ihrer App aus. Das Verhalten der Navigationsschaltfläche ändert sich je nach
danach, ob sich der Nutzer an einem Ziel auf oberster Ebene befindet.
Ein Ziel der obersten Ebene ist das Stammziel oder hierarchischen Zielen verbunden. Für Ziele auf oberster Ebene wird kein Schaltfläche „Aufwärts“ in der oberen App-Leiste, da es kein höheres Ziel gibt. Von ist das Startziel Ihrer App das einzige Ziel der obersten Ebene.
Befindet sich der Nutzer an einem Ziel der obersten Ebene, wird die Navigationsschaltfläche zu einer
Leistensymbol
Das Ziel verwendet einen DrawerLayout
. Wenn im Ziel kein
DrawerLayout
, die Navigationsschaltfläche ist ausgeblendet. Befindet sich der Nutzer an einem anderen Ziel, erscheint die Navigationsschaltfläche als Aufwärtsschaltfläche
Um die Navigationsschaltfläche so zu konfigurieren, dass nur das Startziel als das
übergeordnetes Ziel, erstellen Sie ein AppBarConfiguration
-Objekt und übergeben Sie das entsprechende Navigationsdiagramm wie unten gezeigt:
Kotlin
val appBarConfiguration = AppBarConfiguration(navController.graph)
Java
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
In einigen Fällen müssen Sie eventuell mehrere Ziele auf oberster Ebene definieren,
Standardstartziel zu verwenden. Die Verwendung von BottomNavigationView
ist ein
Dies ist der häufigste Anwendungsfall, bei dem
Bildschirme gleichgeordneter Bildschirme sein können,
die miteinander verwandt sind und jeweils eigene
Ziele. In solchen Fällen können Sie stattdessen eine Reihe von
IDs für den Konstruktor, wie unten gezeigt:
Kotlin
val appBarConfiguration = AppBarConfiguration(setOf(R.id.main, R.id.profile))
Java
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.main, R.id.profile).build();
Symbolleiste erstellen
Um eine Symbolleiste mit NavigationUI
zu erstellen, definieren Sie zunächst die Leiste in Ihrem Haupt-
Aktivität, wie hier gezeigt:
<LinearLayout> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" /> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" ... /> ... </LinearLayout>
Rufen Sie als Nächstes setupWithNavController()
an.
aus der onCreate()
-Methode Ihrer Hauptaktivität aus, wie unten gezeigt
Beispiel:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main) ... val navController = findNavController(R.id.nav_host_fragment) val appBarConfiguration = AppBarConfiguration(navController.graph) findViewById<Toolbar>(R.id.toolbar) .setupWithNavController(navController, appBarConfiguration) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); ... NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); Toolbar toolbar = findViewById(R.id.toolbar); NavigationUI.setupWithNavController( toolbar, navController, appBarConfiguration); }
Um die Navigationsschaltfläche so zu konfigurieren, dass sie als Aufwärtsschaltfläche für alle
Ziele, übergeben Sie einen leeren Satz von Ziel-IDs für Ihre oberste Ebene
beim Erstellen von AppBarConfiguration
. Dies kann nützlich sein,
Beispiel: Sie haben eine zweite Aktivität, bei der eine Aufwärts-Schaltfläche angezeigt werden soll.
in Toolbar
für alle Ziele. So können Nutzende zurücknavigieren,
an die übergeordnete Aktivität, wenn sich auf der Rückseite keine weiteren Ziele befinden.
Stacks. Sie können
setFallbackOnNavigateUpListener()
um das Fallback-Verhalten zu steuern, wenn navigateUp()
sonst
nichts tun, wie im folgenden Beispiel gezeigt:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController val appBarConfiguration = AppBarConfiguration( topLevelDestinationIds = setOf(), fallbackOnNavigateUpListener = ::onSupportNavigateUp ) findViewById<Toolbar>(R.id.toolbar) .setupWithNavController(navController, appBarConfiguration) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { ... NavHostFragment navHostFragment = (NavHostFragment) supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder() .setFallbackOnNavigateUpListener(::onSupportNavigateUp) .build(); Toolbar toolbar = findViewById(R.id.toolbar); NavigationUI.setupWithNavController( toolbar, navController, appBarConfiguration); }
CollapsingToolbarLayout einschließen
Um Ihrer Toolbar ein CollapsingToolbarLayout
hinzuzufügen, definieren Sie zunächst die
Symbolleiste und umgebendes Layout in Ihrer Aktivität, wie unten gezeigt:
<LinearLayout> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="@dimen/tall_toolbar_height"> <com.google.android.material.appbar.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar_layout" android:layout_width="match_parent" android:layout_height="match_parent" app:contentScrim="?attr/colorPrimary" app:expandedTitleGravity="top" app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin"/> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" ... /> ... </LinearLayout>
Rufen Sie als Nächstes setupWithNavController()
an.
aus der onCreate
-Methode deiner Hauptaktivität aus, wie unten gezeigt:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main) ... val layout = findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar_layout) val toolbar = findViewById<Toolbar>(R.id.toolbar) val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController val appBarConfiguration = AppBarConfiguration(navController.graph) layout.setupWithNavController(toolbar, navController, appBarConfiguration) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); ... CollapsingToolbarLayout layout = findViewById(R.id.collapsing_toolbar_layout); Toolbar toolbar = findViewById(R.id.toolbar); NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); NavigationUI.setupWithNavController(layout, toolbar, navController, appBarConfiguration); }
Aktionsleiste
Um die standardmäßige Aktionsleiste bei der Navigation zu unterstützen, rufen Sie Folgendes auf:
setupActionBarWithNavController()
aus der onCreate()
-Methode deiner Hauptaktivität aus (siehe unten). Beachten Sie, dass Sie
Sie müssen Ihre AppBarConfiguration
außerhalb von onCreate()
deklarieren, da Sie
auch beim Überschreiben von onSupportNavigateUp()
verwenden:
Kotlin
private lateinit var appBarConfiguration: AppBarConfiguration ... override fun onCreate(savedInstanceState: Bundle?) { ... val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController appBarConfiguration = AppBarConfiguration(navController.graph) setupActionBarWithNavController(navController, appBarConfiguration) }
Java
AppBarConfiguration appBarConfiguration; ... @Override protected void onCreate(Bundle savedInstanceState) { ... NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration); }
Überschreibe als Nächstes onSupportNavigateUp()
, um die Aufwärtsnavigation zu verarbeiten:
Kotlin
override fun onSupportNavigateUp(): Boolean { val navController = findNavController(R.id.nav_host_fragment) return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() }
Java
@Override public boolean onSupportNavigateUp() { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); return NavigationUI.navigateUp(navController, appBarConfiguration) || super.onSupportNavigateUp(); }
Variationen der Support-App-Leiste
Das Hinzufügen der oberen App-Leiste zu Ihrer Aktivität funktioniert gut, wenn das Layout der App-Leiste die für jedes Ziel in Ihrer App ähnlich sind. Wenn sich die obere App-Leiste jedoch ändert, erheblich zielübergreifend. Dann sollten Sie erwägen, die obere App-Leiste und definieren sie stattdessen in den einzelnen Zielfragmenten.
Beispielsweise kann eines Ihrer Ziele eine standardmäßige Toolbar
verwenden, während
eine andere verwendet AppBarLayout
, um eine komplexere App-Leiste mit Tabs zu erstellen,
wie in Abbildung 2 dargestellt.
So implementieren Sie dieses Beispiel in Ihren Zielfragmenten mithilfe von
NavigationUI
, definiere zuerst die App-Leiste in jedem deiner Fragmentlayouts.
beginnend mit dem Zielfragment, das eine Standardsymbolleiste verwendet:
<LinearLayout>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
... />
...
</LinearLayout>
Definieren Sie als Nächstes das Zielfragment, das eine App-Leiste mit Tabs verwendet:
<LinearLayout>
<com.google.android.material.appbar.AppBarLayout
... />
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
... />
<com.google.android.material.tabs.TabLayout
... />
</com.google.android.material.appbar.AppBarLayout>
...
</LinearLayout>
Die Navigationskonfigurationslogik ist
für beide Fragmente gleich,
Sie sollten jedoch
setupWithNavController()
über die onViewCreated()
-Methode jedes Fragments, anstatt
aus der Aktivität:
Kotlin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val navController = findNavController() val appBarConfiguration = AppBarConfiguration(navController.graph) view.findViewById<Toolbar>(R.id.toolbar) .setupWithNavController(navController, appBarConfiguration) }
Java
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { NavController navController = Navigation.findNavController(view); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); Toolbar toolbar = view.findViewById(R.id.toolbar); NavigationUI.setupWithNavController( toolbar, navController, appBarConfiguration); }
Ziele mit Menüelementen verknüpfen
NavigationUI
bietet auch Hilfsfunktionen zum Verknüpfen von Zielen mit menübasierter Benutzeroberfläche
Komponenten. NavigationUI
enthält eine Hilfsmethode,
onNavDestinationSelected()
,
Dabei werden MenuItem
und
NavController
, der die
verknüpftes Ziel. Wenn id
von MenuItem
mit id
von
das Ziel, kann die NavController
zu diesem Ziel navigieren.
Die unten stehenden XML-Snippets definieren beispielhaft einen Artikel auf der Speisekarte und ein Ziel mit
ein gemeinsamer id
, details_page_fragment
:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" ... > ... <fragment android:id="@+id/details_page_fragment" android:label="@string/details" android:name="com.example.android.myapp.DetailsFragment" /> </navigation>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> ... <item android:id="@+id/details_page_fragment" android:icon="@drawable/ic_details" android:title="@string/details" /> </menu>
Wurde Ihr Menü beispielsweise über die onCreateOptionsMenu()
der Aktivität hinzugefügt,
können Sie die Menüpunkte mit Zielen verknüpfen, indem Sie
onOptionsItemSelected()
, um onNavDestinationSelected()
aufzurufen, wie in
im folgenden Beispiel:
Kotlin
override fun onOptionsItemSelected(item: MenuItem): Boolean { val navController = findNavController(R.id.nav_host_fragment) return item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item) }
Java
@Override public boolean onOptionsItemSelected(MenuItem item) { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); return NavigationUI.onNavDestinationSelected(item, navController) || super.onOptionsItemSelected(item); }
Wenn ein Nutzer jetzt auf den Menüpunkt details_page_fragment
klickt, wird die App
navigiert automatisch zum entsprechenden Ziel mit derselben id
.
Navigationsleiste hinzufügen
Die Navigationsleiste ist ein UI-Bereich, in dem das Hauptnavigationsmenü Ihrer App angezeigt wird. Die Leiste wird angezeigt, wenn der Nutzer das Leistensymbol berührt. in der App-Leiste angezeigt wird oder wenn der Nutzer mit einem Finger vom linken Rand der Bildschirm.
<ph type="x-smartling-placeholder">Das Leistensymbol wird auf allen
Ziele der obersten Ebene, die eine DrawerLayout
verwenden.
Um eine Navigationsleiste hinzuzufügen, deklarieren Sie zuerst ein
DrawerLayout
als Stamm
Ansicht. Fügen Sie im DrawerLayout
ein Layout für den Inhalt der Haupt-UI und
eine andere Ansicht,
die den Inhalt der Navigationsleiste enthält.
Im folgenden Layout wird beispielsweise ein DrawerLayout
mit zwei untergeordneten Ansichten verwendet:
Von NavHostFragment
an
Hauptinhalt und eine
NavigationView
für den Inhalt der Navigationsleiste.
<?xml version="1.0" encoding="utf-8"?>
<!-- Use DrawerLayout as root container for activity -->
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<!-- Layout to contain contents of main body of screen (drawer will slide over this) -->
<androidx.fragment.app.FragmentContainerView
android:name="androidx.navigation.fragment.NavHostFragment"
android:id="@+id/nav_host_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
<!-- Container for contents of drawer - use NavigationView to make configuration easier -->
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true" />
</androidx.drawerlayout.widget.DrawerLayout>
Als Nächstes verbinden Sie den DrawerLayout
in Ihre Navigationsgrafik ein, indem Sie sie an AppBarConfiguration
übergeben, wie in
im folgenden Beispiel:
Kotlin
val appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
Java
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()) .setDrawerLayout(drawerLayout) .build();
Rufen Sie als Nächstes in Ihrer Hauptaktivitätsklasse
setupWithNavController()
aus der onCreate()
-Methode deiner Hauptaktivität aus, wie unten gezeigt:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main) ... val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController findViewById<NavigationView>(R.id.nav_view) .setupWithNavController(navController) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); ... NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); NavigationView navView = findViewById(R.id.nav_view); NavigationUI.setupWithNavController(navView, navController); }
Beginnt in
Navigation 2.4.0-alpha01,
wird der Status jedes Menüpunkts gespeichert und wiederhergestellt, wenn Sie
setupWithNavController
Navigation am unteren Rand
NavigationUI
kann auch die Navigation am unteren Rand übernehmen. Wenn ein Nutzer ein Menü auswählt
ruft der NavController
auf,
onNavDestinationSelected()
und aktualisiert automatisch das ausgewählte Element in der unteren Navigationsleiste.
Um eine untere Navigationsleiste in Ihrer App zu erstellen, definieren Sie zunächst die Leiste in Ihrer Haupt- wie unten dargestellt:
<LinearLayout> ... <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" ... /> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottom_nav" app:menu="@menu/menu_bottom_nav" /> </LinearLayout>
Rufen Sie als Nächstes in Ihrer Hauptaktivitätsklasse
setupWithNavController()
aus der onCreate()
-Methode deiner Hauptaktivität aus, wie unten gezeigt:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main) ... val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController findViewById<BottomNavigationView>(R.id.bottom_nav) .setupWithNavController(navController) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); ... NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); BottomNavigationView bottomNav = findViewById(R.id.bottom_nav); NavigationUI.setupWithNavController(bottomNav, navController); }
Beginnt in
Navigation 2.4.0-alpha01,
wird der Status jedes Menüpunkts gespeichert und wiederhergestellt, wenn Sie
setupWithNavController
Ein umfassendes Beispiel mit Navigation am unteren Rand finden Sie auf der Beispiel für erweiterte Navigation zu Android-Architekturkomponenten auf GitHub.
Auf Navigationsereignisse warten
Mit NavController
interagieren
ist die primäre Methode zur Navigation zwischen Zielen. Das NavController
ist dafür verantwortlich, den Inhalt der NavHost
zu ersetzen.
mit dem neuen Ziel. In vielen Fällen können UI-Elemente, wie eine obere App-Leiste oder
andere permanente Navigationssteuerelemente wie BottomNavigationBar
– live außerhalb
der NavHost
und müssen beim Navigieren zwischen Zielen aktualisiert werden.
NavController
bietet eine OnDestinationChangedListener
-Schnittstelle, die
wird aufgerufen, wenn das aktuelle Ziel der NavController
oder die Argumente ändern sich. Ein neuer Listener kann über die
addOnDestinationChangedListener()
. Wenn addOnDestinationChangedListener()
aufgerufen wird und der Parameter
vorhanden ist, wird es sofort an den Listener gesendet.
NavigationUI
verwendet OnDestinationChangedListener
, um diese gängigen UI-Elemente zu erstellen
Navigation-fähig sind. Beachten Sie jedoch, dass Sie auch
OnDestinationChangedListener
, um eine benutzerdefinierte UI oder ein Unternehmen zu erstellen
Navigationsereignisse berücksichtigen.
Vielleicht verwenden Sie gängige UI-Elemente, die Sie
der App, während sie in anderen ausgeblendet werden. Eigene
OnDestinationChangedListener
, du kannst diese UI selektiv ein- oder ausblenden
-Elemente basierend auf dem Ziel aus, wie im folgenden Beispiel gezeigt:
Kotlin
navController.addOnDestinationChangedListener { _, destination, _ -> if(destination.id == R.id.full_screen_destination) { toolbar.visibility = View.GONE bottomNavigationView.visibility = View.GONE } else { toolbar.visibility = View.VISIBLE bottomNavigationView.visibility = View.VISIBLE } }
Java
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() { @Override public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) { if(destination.getId() == R.id.full_screen_destination) { toolbar.setVisibility(View.GONE); bottomNavigationView.setVisibility(View.GONE); } else { toolbar.setVisibility(View.VISIBLE); bottomNavigationView.setVisibility(View.VISIBLE); } } });
Argumentbasierte Listener
Alternativ können Sie auch Argumente mit Standardwerten in
Die Navigationsgrafik, die vom entsprechenden UI-Controller verwendet werden kann
um seinen Status zu aktualisieren. Anstatt die Logik in der
OnDestinationChangedListener
für die Ziel-ID wie oben beschrieben
Beispiel, können wir ein Argument in NavGraph
erstellen:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation\_graph" app:startDestination="@id/fragmentOne"> <fragment android:id="@+id/fragmentOne" android:name="com.example.android.navigation.FragmentOne" android:label="FragmentOne"> <action android:id="@+id/action\_fragmentOne\_to\_fragmentTwo" app:destination="@id/fragmentTwo" /> </fragment> <fragment android:id="@+id/fragmentTwo" android:name="com.example.android.navigation.FragmentTwo" android:label="FragmentTwo"> <argument android:name="ShowAppBar" android:defaultValue="true" /> </fragment> </navigation>
Dieses Argument wird nicht verwendet, wenn
zum Ziel navigieren, aber
um zusätzliche Informationen an das Ziel anzuhängen, indem
defaultValue
. In diesem Fall gibt der Wert an, ob die App-Leiste
sollte angezeigt werden, wenn sie sich an diesem Ziel befinden.
Wir können jetzt ein OnDestinationChangedListener
in Activity
hinzufügen:
Kotlin
navController.addOnDestinationChangedListener { _, _, arguments -> appBar.isVisible = arguments?.getBoolean("ShowAppBar", false) == true }
Java
navController.addOnDestinationChangedListener( new NavController.OnDestinationChangedListener() { @Override public void onDestinationChanged( @NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments ) { boolean showAppBar = false; if (arguments != null) { showAppBar = arguments.getBoolean("ShowAppBar", false); } if(showAppBar) { appBar.setVisibility(View.VISIBLE); } else { appBar.setVisibility(View.GONE); } } } );
Die NavController
ruft diesen Callback auf, wenn sich das Navigationsziel ändert. Die
Activity
kann jetzt den Status oder die Sichtbarkeit der UI-Komponenten aktualisieren
basierend auf den im Callback empfangenen Argumenten.
Ein Vorteil dieses Ansatzes besteht darin, dass der Activity
nur das Element
Argumente im Navigationsdiagramm und kennt die einzelnen Fragment
nicht
Rollen und Verantwortlichkeiten. Auch die einzelnen Fragmente wissen nicht,
über das enthaltene Activity
und die UI-Komponenten, die ihm gehören.
Weitere Informationen
Weitere Informationen zur Navigation finden Sie in den folgenden zusätzlichen Ressourcen.
Produktproben
- Grundlegendes Navigationsbeispiel für Komponenten der Android-Architektur
- Beispiel für erweiterte Navigation zu Android-Architekturkomponenten
Codelabs
Blogposts
Videos
- 10 Best Practices für den Wechsel zu einer einzigen Aktivität
- Einzelne Aktivität: Warum, wann und wie (Android Dev Summit '18)
- Android Jetpack: Navigation über die Benutzeroberfläche mit dem Navigationscontroller verwalten (Google I/O '18)