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é.
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
onAttach
, convertissant votre Activity en une instance d'une interface que vous fournissezViewModel
partagé que votre activité et votre fragment utilisent pour communiquer.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)
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)