UI-Komponenten über NavigationUI mit NavController verbinden

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">
</ph> Bildschirm mit einer oberen App-Leiste
Abbildung 1: Ein Bildschirm mit einer oberen App-Leiste.

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.

<ph type="x-smartling-placeholder">
</ph> zwei Varianten der oberen App-Leiste: eine Standardsymbolleiste links und
            Appbar-Layout mit einer Symbolleiste und Tabs auf der rechten Seite
Abbildung 2: Zwei Varianten der App-Leiste. Auf der linken Seite befindet sich Toolbar Rechts ein AppBarLayout mit einem Toolbar und Tabs.

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">
</ph> Eine offene Leiste mit einem Navigationsmenü
Abbildung 3: Eine offene Leiste mit einer Navigation

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.

<ph type="x-smartling-placeholder">
</ph> Navigationsleiste unten
Abbildung 4: Eine Navigationsleiste am unteren Rand.

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

Codelabs

Blogposts

Videos