Ich habe versucht, eine Methode in den neuen Navigationskomponenten zu finden, aber ich habe nichts darüber gefunden.
Ich habe das aktuelle Ziel mit:
mainHostFragment.findNavController().currentDestination
Ich kann jedoch keinen Verweis auf das angezeigte Fragment erhalten.
Die Navigation bietet keinen Mechanismus zum Abrufen der Implementierung (d. H. Des Fragments selbst) des aktuellen Ziels.
Gemäß Erstellen von Ereignisrückrufen für die Aktivität sollten Sie entweder mit Ihrem Fragment über kommunizieren
onAttach
-Methode registriert, wird Ihre Aktivität in eine Instanz einer von Ihnen bereitgestellten Schnittstelle umgewandeltViewModel
, mit dem Ihre Aktivität und Ihr Fragment kommunizieren.Sie können so etwas tun:
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)
}
}
}
Für eine erweiterte Kommunikation Listener mit Rückrufmethoden registriert in Fragment.onAttach () (Fragment -> Activity rather one direction communication
) Und SharedViewModel (bidirectional
, wichtig, um ViewModelProviders, and Lifecycle owner that is scoped to getActivity()
zu haben)
Mit Michals Antwort habe ich diese Erweiterungsfunktion zum Testen geschrieben:
@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
}
So verwendet:
val myFragment = activity.getFragment(MyFragment::class.Java)