web-dev-qa-db-fra.com

Android Navigation Jetpack Comment gérer le contenu de la barre d'outils et de la barre de navigation inférieure

Je suis un peu confus quant à la façon dont le composant Navigation s'intègre dans le comportement de l'application. Tout cela a l'air sympa et brillant dans des tutoriels où vous ne faites pas de choses trop complexes, mais lors de la mise en œuvre dans une application réelle, les choses semblent différentes.

Avant la navigation

Avant d'implémenter la navigation, j'ai dû exécuter manuellement des transactions de fragments. Pour ce faire, mon fragment implémenterait une interface onFragmentAction qui a passé un bundle au principal Activity et dans l'activité basée sur les actions, remplacer le fragment actuel par un autre.

La deuxième partie qui doit être manipulée est la barre d'outils supérieure et le BottomAppBar. Par exemple, BottomAppBar doit avoir le FAB aligné différemment sur certains fragments ou caché dans d'autres. De plus, le haut ToolBar doit être développé sur certains ou réduit sur d'autres. Pour ce faire, j'ai écouté FragmentManager.OnBackStackChangedListener Et en me basant sur la balise fragment getSupportFragmentManager().getBackStackEntryAt(size - 1).getName() modifiez la disposition en conséquence.

avec navigation

La première partie semble être facile à faire: passer les paramètres et démarrer de nouveaux fragments. Mais je n'ai aucune idée si la navigation peut gérer la gestion des barres d'outils ou si je dois continuer à la gérer à partir de mon activité.

14
Alin

Le titre de la barre d'outils est défini en fonction de la valeur `` étiquette '' dans le graphique de navigation, si vous voulez faire quelque chose de différent avec la barre d'outils ou BottomAppBar, vous pouvez ajouter addOnNavigatedListener dans votre activité et en fonction de la destination actuelle, faites quelque chose.

findNavController(nav_Host_fragment).addOnNavigatedListener { controller, 
 destination ->
 when(destination.id) {
    R.id.destination1 -> {
        //Do something with your toolbar or BottomAppBar
    }
    R.id.destination2 -> {
        //Do something with your toolbar or BottomAppBar
    }

 }
}
5
Alex

Même si la solution d'Alex fonctionne, je ne la recommanderais pas pour gérer la barre d'outils.

La barre d'outils doit faire partie de la disposition de votre fragment et chaque fragment doit gérer sa propre barre d'outils. vous pouvez gonfler différents menus pour chaque fragment. même dans le cas où vous souhaiteriez avoir la barre d'outils dans l'activité, je recommanderais d'obtenir une référence à l'activité de formulaire de la barre d'outils (via une interface), puis d'ajouter et de manipuler ses éléments dans le fragment lui-même.

Cela découplerait votre activité et votre fragment (ce qui est l'un des objectifs du graphique de navigation et d'un routeur). une bonne règle de base est d'imaginer que vous voulez supprimer le fragment, alors vous ne devriez pas avoir à modifier l'activité.

15
Kayvan N

Dans votre fragment:

NavController navHostFragment = NavHostFragment.findNavController(this);
NavigationUI.setupWithNavController(toolbar, navHostFragment);

enter image description here

Lorsque je clique sur un élément de l'élément de liste (Explore Fragment), la négation se fera en DetailFragment et lorsque je cliquera sur le bouton Précédent de la barre d'outils, elle renverra MainFragment.

4
Nhật Trần

si vous souhaitez atteindre un autre fragment en appelant l'élément de menu, vous devez donner à l'ID d'élément le même identifiant que celui de l'ID de destination.

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return 
       item.onNavDestinationSelected(findNavController(R.id.nav_Host_fragment))
            || super.onOptionsItemSelected(item)
}


<item Android:id="@+id/dailyInfoFragment"
      Android:title="@string/action_settings"
      Android:orderInCategory="100"
      app:showAsAction="never"/>


    <fragment
        Android:id="@+id/dailyInfoFragment"
        Android:name="com.example.sonyadmin.infoPerDay.DailyInfoFragment"
        Android:label="fragment_daily_info"
        tools:layout="@layout/fragment_daily_info"
        />