FragmentContainerView als NavHostFragment

Lesezeit: 3 Minuten

Scheint so, als würde man die verwenden FragmentContainerView funktioniert nicht direkt aus der Box?

<androidx.fragment.app.FragmentContainerView
        class="androidx.navigation.fragment.NavHostFragment"
        android:id="@+id/fragment_nav_host"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_app" />

Hier ist mein Code mit fragment-ktx:1.2.0-rc01 und ich bekomme einfach immer diesen Fehler:

Caused by: java.lang.IllegalStateException: Activity ...MainActivity@797467d does not have a NavController set on 2131296504

Nur mit <fragment> funktioniert und AFAIK, es soll nur ersetzt werden durch FragmentContainerView.

Übersehe ich etwas oder konnte jemand etwas gebrauchen? FragmentContainerView Als ein NavHostFragment?

Danke vielmals!

Benutzer-Avatar
Ove Störholt

Aufgrund dieses Fehlerberichts:
https://issuetracker.google.com/issues/142847973

Dies ist der einzige Weg (derzeit):

val navHostFragment = supportFragmentManager
    .findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

(Java):

NavHostFragment navHostFragment =
    (NavHostFragment) getSupportFragmentManager()
        .findFragmentById(R.id.my_nav_host_fragment);
NavController navController = navHostFragment.getNavController();

  • sicherlich besser nur zu verwenden fragmentanstatt sich Gedanken darüber zu machen, dass Sie daran denken müssen, diese Problemumgehung zu verwenden? Wir haben Abstürze gesehen, aber nur bei einigen Benutzern, komisch …

    – hmac

    19. März 2020 um 9:40 Uhr


  • @hmac In der verlinkten Ausgabe wird diskutiert, warum Sie Fragment nicht verwenden sollten: issuetracker.google.com/issues/142847973#comment15: Der Lint-Check ist genau deshalb da, weil man unbedingt auf FragmentContainerView umstellen sollte.

    – Banane

    10. August 2020 um 14:18 Uhr

  • zeigt nichts an. Es ist seltsam, dass ich bei der Verwendung von feststecke!

    – Junia Montana

    9. November 2020 um 4:44 Uhr

  • was wir mit navController zu tun haben, weil die Variable unbenutzt ist

    – Tippu Fisal Sheriff

    4. April 2021 um 7:40 Uhr

Aktualisierung August 2020

Hier ist die Lösung, die von empfohlen wird die offizielle Android-Dokumentation.

Kotlin-Version:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

Java-Version:

NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
NavController navController = navHostFragment.getNavController();

Ich zitiere das Dokument:

Beim Erstellen des NavHostFragments mit FragmentContainerView oder wenn Sie das NavHostFragment manuell über eine FragmentTransaction zu Ihrer Aktivität hinzufügen, versuchen Sie es Rufen Sie den NavController ab in onCreate() einer Aktivität via Navigation.findNavController(Activity, @IdRes int) schlägt fehl. Sie sollten den NavController stattdessen direkt aus dem NavHostFragment abrufen.


Der Fehlerbericht, der von gemeldet wurde Ove Störholt wird nicht behoben. Du kannst sehen hier den Status „Wird nicht behoben (undurchführbar)“.

  • Während die ursprüngliche Aufgabe als “Won’t Fix (Infeasible)” gekennzeichnet war, haben sie einen Link zu einer anderen Aufgabe erstellt, damit sie vielleicht planen, das Problem doch zu beheben: issuetracker.google.com/issues/143145612

    – Scharf

    25. Oktober 2020 um 10:04 Uhr

Benutzer-Avatar
Lungenentzündung

Was ich tat, war, auf die zu warten NavHostFragment seine Ansicht aufzublähen:

Kotlin:

super.onCreate(savedInstanceState)

// Set up the form and list.
setContentView(R.layout.activity_xxx)

// Set up navigation - action bar and sidebar.
/// Let the navigation view check/uncheck the menu items.
nav_view.post { // wait for NavHostFragment to inflate
    val navController = findNavController()
    nav_view.setupWithNavController(navController)
    nav_view.setNavigationItemSelectedListener(this)
}

Java8 (mit Lambda):

navigationView.post(() -> { // wait for NavHostFragment to inflate
    navController = Navigation.findNavController(activity, R.id.nav_host_fragment);
    NavigationUI.setupWithNavController(navView, navController);
    navView.setNavigationItemSelectedListener(navItemSelectedListener);
});

  • Ich hatte verwendet <fragment> um den Fehler zu vermeiden. Aber ich war beunruhigt über einen weiteren unbekannten Fehler. Also habe ich die späte Antwort von @Pnemonic gefunden und versucht, sie zu verwenden <FragmentContainerView>. Das Problem wurde behoben, danke!

    – hat

    25. Mai 2020 um 6:36 Uhr


Benutzer-Avatar
Galih Al

Ich habe das gleiche Problem bei der Verwendung von Kotlin:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment

val navController = navHostFragment.navController

Fügen Sie es einfach hinzu

setupActionBarWithNavController(navController)

verwenden android:name Anstatt von class. funktioniert.

<androidx.fragment.app.FragmentContainerView
    android:name="androidx.navigation.fragment.NavHostFragment"
    ...

1299650cookie-checkFragmentContainerView als NavHostFragment

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy