Connetti i componenti della UI a NavController utilizzando NavigationUI

Il componente Navigazione include una classe NavigationUI. Questa classe contiene metodi statici che gestiscono la navigazione con la barra delle app in alto, il riquadro di navigazione a scomparsa e la navigazione in basso.

Barra delle app superiore

La barra superiore dell'app fornisce una posizione coerente nella parte superiore dell'app per visualizzare le informazioni e le azioni della schermata corrente.

schermata che mostra una barra superiore dell'app
Figura 1. Una schermata che mostra una barra superiore dell'app.

NavigationUI include metodi che aggiornano automaticamente i contenuti nella barra superiore dell'app quando gli utenti navigano all'interno dell'app. Ad esempio, NavigationUI utilizza le etichette di destinazione del grafico di navigazione per mantenere aggiornato il titolo della barra dell'app principale.

<navigation>
    <fragment ...
              android:label="Page title">
      ...
    </fragment>
</navigation>

Quando utilizzi NavigationUI con le implementazioni principali della barra dell'app discusse di seguito, l'etichetta allegata alle destinazioni può essere completata automaticamente a partire dagli argomenti forniti alla destinazione utilizzando il formato {argName} nell' etichetta.

NavigationUI fornisce supporto per i seguenti tipi di barre dell'app principali:

Per ulteriori informazioni sulle barre delle app, vedi Configurare la barra delle app.

AppBarConfiguration

NavigationUI utilizza un oggetto AppBarConfiguration per gestire il comportamento del pulsante di navigazione nell'angolo in alto a sinistra dell'area di visualizzazione dell'app. Il comportamento del pulsante di navigazione cambia a seconda che l'utente si trovi o meno in una destinazione di primo livello.

Una destinazione di primo livello è la destinazione principale, o di livello superiore, in un insieme di destinazioni correlate gerarchicamente. Le destinazioni di primo livello non visualizzano il pulsante Freccia su nella barra dell'app in alto perché non esiste una destinazione di livello superiore. Per impostazione predefinita, la destinazione iniziale della tua app è l'unica destinazione di primo livello.

Quando l'utente si trova in una destinazione di primo livello, il pulsante di navigazione diventa un'icona del cassetto se la destinazione utilizza un DrawerLayout. Se la destinazione non utilizza DrawerLayout, il pulsante di navigazione è nascosto. Quando l'utente si trova su qualsiasi altra destinazione, il pulsante di navigazione viene visualizzato come pulsante Su . Per configurare il pulsante di navigazione utilizzando solo la destinazione iniziale come destinazione di primo livello, crea un oggetto AppBarConfiguration e inseriscilo nel grafico di navigazione corrispondente, come mostrato di seguito:

Kotlin

val appBarConfiguration = AppBarConfiguration(navController.graph)

Java

AppBarConfiguration appBarConfiguration =
        new AppBarConfiguration.Builder(navController.getGraph()).build();

In alcuni casi, potrebbe essere necessario definire più destinazioni di primo livello anziché utilizzare la destinazione di partenza predefinita. Un caso d'uso comune di questo tipo è l'utilizzo di BottomNavigationView, in cui potresti avere schermate di pari livello non correlate gerarchicamente tra loro e ognuna di queste può avere il proprio insieme di destinazioni correlate. In casi come questi, puoi passare un insieme di ID destinazione al costruttore, come mostrato di seguito:

Kotlin

val appBarConfiguration = AppBarConfiguration(setOf(R.id.main, R.id.profile))

Java

AppBarConfiguration appBarConfiguration =
        new AppBarConfiguration.Builder(R.id.main, R.id.profile).build();

Crea una barra degli strumenti

Per creare una barra degli strumenti con NavigationUI, devi prima definire la barra nell'attività principale, come mostrato:

<LinearLayout>
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar" />
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        ... />
    ...
</LinearLayout>

Successivamente, chiama setupWithNavController() dal metodo onCreate() dell'attività principale, come mostrato nell'esempio che segue:

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);
}

Per configurare il pulsante di navigazione in modo che venga visualizzato come pulsante Su per tutte le destinazioni, trasmetti un insieme vuoto di ID destinazione per le destinazioni di primo livello quando crei la tua AppBarConfiguration. Questo può essere utile se, ad esempio, hai una seconda attività che dovrebbe mostrare un pulsante Su nella sezione Toolbar su tutte le destinazioni. In questo modo l'utente può tornare all'attività padre quando non ci sono altre destinazioni nello stack posteriore. Puoi utilizzare setFallbackOnNavigateUpListener() per controllare il comportamento di fallback per i casi in cui navigateUp() non farà nulla, come mostrato nell'esempio seguente:

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);
}

Includi layout barra degli strumentiCollapsing

Per includere un elemento CollapsingToolbarLayout con la barra degli strumenti, innanzitutto definisci la barra degli strumenti e il layout circostante nella tua attività, come mostrato di seguito:

<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>

Successivamente, chiama setupWithNavController() dal metodo onCreate dell'attività principale, come mostrato di seguito:

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);
}

Barra delle azioni

Per aggiungere il supporto della navigazione alla barra delle azioni predefinita, chiama setupActionBarWithNavController() dal metodo onCreate() dell'attività principale, come mostrato di seguito. Tieni presente che devi dichiarare AppBarConfiguration al di fuori di onCreate(), poiché lo utilizzi anche quando sostituisci onSupportNavigateUp():

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);
}

Quindi, esegui l'override di onSupportNavigateUp() per gestire la navigazione verso l'alto:

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();
}

Supporta le varianti della barra dell'app

Aggiungere la barra superiore dell'app all'attività funziona bene quando il layout della barra dell'app è simile per ogni destinazione nell'app. Se, tuttavia, la barra dell'app superiore cambia sostanzialmente da una destinazione all'altra, valuta la possibilità di rimuoverla dall'attività e definirla in ogni frammento di destinazione.

Ad esempio, una delle destinazioni potrebbe utilizzare un elemento Toolbar standard, mentre un'altra utilizza una AppBarLayout per creare una barra delle app più complessa con schede, come mostrato nella figura 2.

due varianti principali della barra dell&#39;app: una barra degli strumenti standard a sinistra e un layout della barra delle app con una barra degli strumenti e schede a destra
Figura 2. Due varianti della barra dell'app. A sinistra, un elemento Toolbar standard. A destra, un AppBarLayout con Toolbar e schede.

Per implementare questo esempio nei frammenti di destinazione utilizzando NavigationUI, definisci prima la barra dell'app in ciascuno dei tuoi layout di frammento, iniziando con il frammento di destinazione che utilizza una barra degli strumenti standard:

<LinearLayout>
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        ... />
    ...
</LinearLayout>

A questo punto, definisci il frammento di destinazione che utilizza una barra dell'app con schede:

<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>

La logica di configurazione della navigazione è la stessa per entrambi i frammenti, tranne per il fatto che devi chiamare setupWithNavController() dall'interno del metodo onViewCreated() di ogni frammento, anziché inizializzarlo dall'attività:

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);
}

Associa le destinazioni alle voci di menu

NavigationUI fornisce anche aiutanti per associare le destinazioni ai componenti dell'interfaccia utente basati su menu. NavigationUI contiene un metodo helper, onNavDestinationSelected(), che prende MenuItem insieme al NavController che ospita la destinazione associata. Se id del MenuItem corrisponde al id della destinazione, il NavController può raggiungere la destinazione.

Ad esempio, gli snippet XML riportati di seguito definiscono una voce di menu e una destinazione con un elemento id, details_page_fragment comune:

<?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>

Se il tuo menu è stato aggiunto tramite l'onCreateOptionsMenu() dell'attività, ad esempio, puoi associare le voci di menu alle destinazioni sostituendo onOptionsItemSelected() dell'attività in modo che chiami onNavDestinationSelected(), come mostrato nell'esempio seguente:

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);
}

Ora, quando un utente fa clic sulla voce di menu details_page_fragment, l'app vai automaticamente alla destinazione corrispondente con lo stesso id.

Aggiungi un riquadro di navigazione a scomparsa

Il riquadro di navigazione a scomparsa è un riquadro dell'interfaccia utente che mostra il menu di navigazione principale dell'app. Il riquadro a scomparsa viene visualizzato quando l'utente tocca l'icona del riquadro a scomparsa nella barra delle app o quando l'utente fa scorrere un dito dal bordo sinistro dello schermo.

un riquadro a scomparsa aperto che mostra un menu di navigazione
Figura 3. Un riquadro a scomparsa aperto che mostra un menu di navigazione.

L'icona del riquadro a scomparsa viene visualizzata in tutte le destinazioni di primo livello che utilizzano un DrawerLayout.

Per aggiungere un riquadro di navigazione a scomparsa, devi prima dichiarare DrawerLayout come vista principale. All'interno di DrawerLayout, aggiungi un layout per i contenuti principali dell'interfaccia utente e un'altra visualizzazione che include i contenuti del riquadro di navigazione a scomparsa.

Ad esempio, il seguente layout utilizza un elemento DrawerLayout con due visualizzazioni secondarie: un elemento NavHostFragment per contenere i contenuti principali e un'elemento NavigationView per i contenuti del riquadro di navigazione a scomparsa.

<?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>

Poi collega DrawerLayout al grafico di navigazione passandolo a AppBarConfiguration, come mostrato nell'esempio seguente:

Kotlin

val appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)

Java

AppBarConfiguration appBarConfiguration =
        new AppBarConfiguration.Builder(navController.getGraph())
            .setDrawerLayout(drawerLayout)
            .build();

Successivamente, nella classe di attività principale, chiama setupWithNavController() utilizzando il metodo onCreate() dell'attività principale, come mostrato di seguito:

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);
}

A partire da Navigazione 2.4.0-alpha01, lo stato di ogni elemento del menu viene salvato e ripristinato quando utilizzi setupWithNavController.

Navigazione in basso

NavigationUI può anche gestire la navigazione in basso. Quando un utente seleziona una voce di menu, NavController chiama onNavDestinationSelected() e aggiorna automaticamente l'elemento selezionato nella barra di navigazione in basso.

barra di navigazione in basso
Figura 4. Una barra di navigazione in basso.

Per creare una barra di navigazione nella parte inferiore dell'app, innanzitutto definisci la barra nell'attività principale, come mostrato di seguito:

<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>

Successivamente, nella classe di attività principale, chiama setupWithNavController() utilizzando il metodo onCreate() dell'attività principale, come mostrato di seguito:

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);
}

A partire da Navigazione 2.4.0-alpha01, lo stato di ogni elemento del menu viene salvato e ripristinato quando utilizzi setupWithNavController.

Per un esempio completo che include la navigazione in basso, vedi l'esempio di navigazione avanzata dei componenti dell'architettura Android su GitHub.

Ascolta gli eventi di navigazione

L'interazione con NavController è il metodo principale per navigare tra le destinazioni. NavController è responsabile della sostituzione dei contenuti di NavHost con la nuova destinazione. In molti casi, gli elementi dell'interfaccia utente, come la barra superiore dell'app o altri controlli di navigazione permanenti come BottomNavigationBar, risiedono al di fuori del NavHost e devono essere aggiornati durante la navigazione tra le destinazioni.

NavController offre un'interfaccia OnDestinationChangedListener che viene richiamata quando la destinazione corrente o gli argomenti di NavController cambiano. È possibile registrare un nuovo listener tramite il metodo addOnDestinationChangedListener(). Tieni presente che quando chiami addOnDestinationChangedListener(), se la destinazione corrente esiste, viene immediatamente inviata al tuo listener.

NavigationUI utilizza OnDestinationChangedListener per rendere sensibile alla navigazione questi componenti comuni dell'interfaccia utente. Tuttavia, tieni presente che puoi anche utilizzare OnDestinationChangedListener in modo autonomo per rendere sensibile qualsiasi interfaccia utente o logica di business personalizzata degli eventi di navigazione.

Ad esempio, potresti avere elementi UI comuni che intendi mostrare in alcune aree della tua app e nasconderli in altre. Utilizzando OnDestinationChangedListener, puoi mostrare o nascondere selettivamente questi elementi dell'interfaccia utente in base alla destinazione di destinazione, come mostrato nell'esempio seguente:

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);
       }
   }
});

Listener basati su argomenti

In alternativa, puoi anche utilizzare argomenti con valori predefiniti all'interno del grafico di navigazione, che possono essere utilizzati dal controller UI appropriato per aggiornarne lo stato. Ad esempio, anziché basare la logica in OnDestinationChangedListener sull'ID destinazione come nell'esempio precedente, possiamo creare un argomento in NavGraph:

<?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>

Questo argomento non viene utilizzato quando navighi verso la destinazione, ma piuttosto come un modo per collegare informazioni aggiuntive alla destinazione utilizzando defaultValue. In questo caso, il valore indica se la barra delle app deve essere visualizzata in questa destinazione.

Ora possiamo aggiungere un OnDestinationChangedListener in Activity:

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);
                }
            }
        }
);

L'elemento NavController attiva questo callback ogni volta che la destinazione di navigazione viene modificata. Ora Activity può aggiornare lo stato o la visibilità dei componenti dell'interfaccia utente di sua proprietà in base agli argomenti ricevuti nel callback.

Un vantaggio di questo approccio è che Activity vede solo gli argomenti nel grafico di navigazione e non conosce i singoli ruoli e responsabilità di Fragment. Allo stesso modo, i singoli frammenti non conoscono il Activity contenitore e i componenti dell'interfaccia utente di sua proprietà.

Risorse aggiuntive

Per scoprire di più sulla navigazione, consulta le seguenti risorse aggiuntive.

Samples

Codelab

Post del blog

Video