it-swarm.dev

Nawigacja Jetpack: NavHostManager nie jest aktywnym fragmentem FragmentManager

Używam Nawigacji Jetpack do obsługi nawigacji dla Fragmentów.
[...

Wyjątek:

Java.lang.IllegalArgumentException: Fragment NavHostFragment{820022f} is not an active fragment of FragmentManager FragmentManager{5a5703c in HostCallbacks{a0b41c5}}
        at Android.support.v4.app.FragmentManagerImpl.setPrimaryNavigationFragment(FragmentManager.Java:3389)
        at Android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.Java:783)
        at Android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.Java:2595)
        at Android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.Java:2382)
        at Android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.Java:2337)
        at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:2244)

Główny układ aktywności

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".LoginActivity" >

    <fragment
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:id="@+id/my_nav_Host_fragment"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/nav_graph"
        app:defaultNavHost="true"
        />
</FrameLayout>

Działalność główna - Kotlin

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.login_activity)
        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                    .replace(R.id.container, LoginFragment.newInstance())
                    .commitNow()
        }
    }

    override fun onSupportNavigateUp()
        = findNavController(R.id.my_nav_Host_fragment).navigateUp()

}

Próbuję przetestować funkcje JetPack, a obecnie utknąłem na tym, każdy ma pojęcie, co może być nie tak? Czy to dlatego, że Android 3.2 wciąż jest w podglądzie? Każda pomoc byłaby bardzo mile widziana ..

7
sallah kokaina

Rozwiązany.

Problem pochodzi z wywołania do FragmentManager, aby zastąpić jego zawartość nową instancją LoginFragment, po prostu usunięcie następującego fragmentu kodu z metody onCreate rozwiązało go

if (savedInstanceState == null) {
    supportFragmentManager.beginTransaction()
            .replace(R.id.container, LoginFragment.newInstance())
            .commitNow()
}
14
sallah kokaina

Dodatkowe wyjaśnienie, ponieważ spowodowało to, że przez kilka minut drapałem się po głowie:

Możesz utworzyć NavHostFragment programowo używając tego kodu z posta OP i odpowiedzieć lub możesz umieścić app:defaultNavHost="true" na fragmencie głównej aktywności.

Android Studio stworzy oba te sposoby podczas tworzenia plików pośredniczących. Usunięcie kodu OP lub tej właściwości sprawi, że zadziała.

0
IsiSku