wake-up-neo.com

Wie kann ich das aktuelle Fragment in NavHostFragment abrufen?

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.

17
BenjaminBihr

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

  • Wenn das Fragment einen Rückruf in seiner onAttach -Methode registriert, wird Ihre Aktivität in eine Instanz einer von Ihnen bereitgestellten Schnittstelle umgewandelt
  • Verwenden Sie ein gemeinsames ViewModel , mit dem Ihre Aktivität und Ihr Fragment kommunizieren.
15
ianhanniballake

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)

12
Michał Ziobro

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)
2
CampbellMG