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é.
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
}
}
}
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é.
Dans votre fragment:
NavController navHostFragment = NavHostFragment.findNavController(this);
NavigationUI.setupWithNavController(toolbar, navHostFragment);
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
.
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"
/>