69 votes

Titre ActionBar dynamique d'un fragment à l'aide de la navigation AndroidX

Je suis l'aide de la nouvelle Navigation composant à partir d'Android Jetpack.

La racine de l'Activité de l'installation est assez simple:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)

    val navController = findNavController(R.id.navigationFragment)
    setupActionBarWithNavController(navController)

    bottomNavigationView.setupWithNavController(navController)
}

Il fonctionne bien lorsque le Fragment du titre est défini dans la navigation graphique. Mais pour un Fragment, je veux mettre le titre de façon dynamique.

J'ai essayé avec findNavController().currentDestination.label = "Hello world" mais il ne fait rien.

Je pourrais bien sûr utiliser un truc comme (activity as? AppCompatActivity)?.supportActionBar?.title = "Hello world", mais je sens que ça va casser la magie setupActionBarWithNavController() fait pour moi. Il a t-il moyen de mettre à jour l'Action de la Barre de titre de façon dynamique?

129voto

CommonsWare Points 402670

Comme d' 1.0.0-alpha08, vous pouvez avoir la NavigationUI bits définir dynamiquement le titre... si la dynamique de bits sont des arguments sur l'action de navigation.

Ainsi, par exemple, dans votre navigation graphique, vous pourriez avoir quelque chose comme ceci:

  <fragment
    android:id="@+id/displayFragment"
    android:name="com.commonsware.jetpack.sampler.nav.DisplayFragment"
    android:label="Title: {title}" >
    <argument
      android:name="modelId"
      app:argType="string" />
    <argument
      android:name="title"
      app:argType="string" />
  </fragment>

Ici, l' android:label d'attribut pour notre <fragment> a un nom d'argument enveloppé dans des accolades ({title} en "Title: {title}". L'application de la barre de titre sera ensuite mis à la valeur de l'étiquette, avec {title} remplacé par la valeur de l' title argument.

Si vous avez besoin de quelque chose de plus élaboré que cela — par exemple, vous souhaitez rechercher le modèle d'identification et de lire une propriété de il — vous aurez besoin d'utiliser plusieurs approches manuelles, telles que celles décrites dans d'autres réponses à cette question.

18voto

En tenant compte du fait que votre activité d'hôte est MainActivity , ajoutez simplement le code suivant à votre MainActivity s onCreate fun

 val navController = Navigation.findNavController(this, R.id.nav_host_fragment)

// setting title according to fragment
navController.addOnDestinationChangedListener { 
    controller, destination, arguments ->
        toolbar.title = navController.currentDestination?.label
}
 

9voto

Bradleycorn Points 179

A partir de maintenant, Le Jetpack de Navigation des composants de l'Architecture ne fournissent aucune "intégrée" de façon à ce faire, et vous aurez à mettre en place votre propre "personnalisé" méthode pour le faire.

Il existe une demande de fonctionnalité pour obtenir des fonctionnalités pour la dynamique des étiquettes sur les destinations ajoutées à la nouvelle Jetpack de Navigation des Composants de l'Architecture. Si vous êtes ici parce que vous voulez/besoin de cette fonctionnalité, veuillez star de l'existant, demande de fonctionnalité, ici: https://issuetracker.google.com/issues/80267266

8voto

Naveen Rao Points 191

Supprimer l'étiquette du fichier graph.xml

 android:label="fragment_info"
 

et utilisez l'approche old school si vous souhaitez définir dynamiquement le titre du fragment à partir du fragment lui-même

 getActivity().setTitle("Your Title");
 

3voto

Alex Points 2578

Une autre solution consiste à utiliser ViewModel et LiveData, attachez viewmodel à votre activité et vos fragments, ajoutez un champ de données de vie à l'intérieur de viewmodel

 val title = MutableLiveData<String>()
 

À partir de votre activité, observez ce champ et s'il est modifié, mettez à jour le titre de la barre d'outils

 viewModel?.title?.observe(this, Observer { 
        my_toolbar.title=it
    })
 

À partir de votre fragment souhaité, modifiez le champ de titre à l'intérieur du modèle d'affichage

 viewModel?.title?.value="New title"
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X