web-dev-qa-db-fra.com

Comment puis-je récupérer le fragment actuel dans NavHostFragment?

J'ai essayé de trouver une méthode dans les nouveaux composants de navigation mais je n'ai rien trouvé à ce sujet.

J'ai la destination actuelle avec:

mainHostFragment.findNavController().currentDestination

Mais je ne peux obtenir aucune référence au fragment affiché.

10
BenjaminBihr

La navigation ne fournit aucun mécanisme pour obtenir l'implémentation (c'est-à-dire le fragment lui-même) de la destination actuelle.

Selon le Création de rappels d'événements à l'activité , vous devez soit communiquer avec votre fragment en

  • Le Fragment enregistre un rappel dans sa méthode onAttach, convertissant votre Activity en une instance d'une interface que vous fournissez
  • Utilisez un ViewModel partagé que votre activité et votre fragment utilisent pour communiquer.
15
ianhanniballake

Vous pouvez faire quelque chose comme ça:

  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        val navHostFragment = supportFragmentManager.fragments.first() as? NavHostFragment
        if(navHostFragment != null) {
            val childFragments = navHostFragment.childFragmentManager.fragments
            childFragments.forEach { fragment ->
                fragment.onActivityResult(requestCode, resultCode, data)
            }
        }
    }

Mais pour une communication plus avancée écouteurs avec méthodes de rappel enregistrés dans Fragment.onAttach () (Fragment -> Activity rather one direction communication) Et SharedViewModel (bidirectional, important d'avoir ViewModelProviders, and Lifecycle owner that is scoped to getActivity() plutôt)

12
Michał Ziobro

En utilisant la réponse de Michal, j'ai écrit cette fonction d'extension pour tester:

@Suppress("UNCHECKED_CAST")
fun <F : Fragment> AppCompatActivity.getFragment(fragmentClass: Class<F>): F? {
    val navHostFragment = this.supportFragmentManager.fragments.first() as NavHostFragment

    navHostFragment.childFragmentManager.fragments.forEach {
        if (fragmentClass.isAssignableFrom(it.javaClass)) {
            return it as F
        }
    }

    return null
}

Utilisé comme ceci:

val myFragment = activity.getFragment(MyFragment::class.Java)
2
CampbellMG