J'ai installé la dernière version d'Android Studio dans les canaris et suivi cette instruction ( https://developer.Android.com/topic/libraries/architecture/navigation/navigation-implementing ) pour mettre en œuvre une navigation simple de deux pages. Fondamentalement, page1 a un bouton et lorsque l'on clique dessus, l'application affiche page2.
Cela fonctionne, mais il y a un problème ... Il ne semble pas faire quoi que ce soit avec la barre d'action automatiquement. Est-il censé afficher la flèche haut/arrière et l'attribut "Label" sur la barre d'action automatiquement par la bibliothèque de navigation? Ou suis-je censé faire tout le travail manuellement comme avant? Je veux montrer la flèche de retour et "Détails" sur la barre d'action (outil) lorsque la page2 est affichée.
Sur le bouton, cliquez à la page 1.
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
{
button1.setOnClickListener {
val nav = NavHostFragment.findNavController(this);
nav.navigate(R.id.show_page2)
}
}
Activité principale XML. Par défaut, c'était la barre d'action par défaut, je l'ai remplacée par une barre d'outils. Il n'y avait pas de différence.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.appcompat.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_height="?attr/actionBarSize"
Android:elevation="4dp"
Android:background="?attr/colorPrimary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Android:layout_width="match_parent">
</androidx.appcompat.widget.Toolbar>
<fragment
Android:id="@+id/my_nav_Host_fragment"
Android:name="androidx.navigation.fragment.NavHostFragment"
Android:layout_width="0dp"
Android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
app:navGraph="@navigation/nav_graph"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Graphique de navigation XML.
<?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"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/nav_graph"
app:startDestination="@id/page1">
<activity
Android:id="@+id/mainActivity2"
Android:name="com.Android.navtest.MainActivity"
Android:label="activity_main"
tools:layout="@layout/activity_main"/>
<fragment
Android:id="@+id/page1"
Android:name="com.Android.navtest.BlankFragment2"
Android:label="Home page"
tools:layout="@layout/page1">
<action
Android:id="@+id/show_page2"
app:destination="@id/page2"
app:enterAnim="@anim/anim1"
app:popExitAnim="@anim/anim2"/>
</fragment>
<fragment
Android:id="@+id/page2"
Android:name="com.Android.navtest.BlankFragment"
Android:label="Details"
tools:layout="@layout/page2"/>
</navigation>
Vous pouvez connecter votre ActionBar à un NavController à l’aide de NavigationUI.setupActionBarWithNavController()
. Cela se fait généralement dans votre activité, juste après avoir appelé setSupportActionBar()
:
supportActionBar = findViewById<Toolbar>(R.id.toolbar)
// Get the NavController for your NavHostFragment
val navController = findNavController(R.id.nav_Host_fragment)
// Set up the ActionBar to stay in sync with the NavController
setupActionBarWithNavController(navController)
Cette approche est couverte dans le Discussion sur la navigation chez Google I/O 2018 .
Si vous souhaitez que le bouton de navigation arrière soit masqué à plusieurs endroits (par défaut, il s'agit uniquement du fragment d'origine), vous pouvez ajouter des identifiants de fragments à AppBarConfiguration et les transmettre en tant que deuxième paramètre de setupActionBarWithNavController, par exemple:
val appBarConfiguration = AppBarConfiguration(setOf(R.id.splashFragment, R.id.onboardingFragment, R.id.homeFragment))
setupActionBarWithNavController(findNavController(R.id.nav_Host), appBarConfiguration)