web-dev-qa-db-fra.com

Jetpack Navigation: NavHostManager n'est pas un fragment actif de FragmentManager

J'utilise Jetpack Navigation pour gérer la navigation pour les fragments.
J'ai suivi la documentation et installé les composants requis, mais l'application se bloque juste en essayant d'afficher l'activité hébergeant le fragment NavHost

Exception:

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)

Présentation de l'activité principale

<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>

Activité principale - 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()

}

J'essaie de tester les fonctionnalités de JetPack, et je suis actuellement bloqué sur celui-ci, tout le monde a une idée de ce qui pourrait mal se passer? Est-ce dû au fait que Android 3.2 soit encore en avant-première? Toute aide serait très appréciée..

7
sallah kokaina

Résolu.

Le problème provenait de l'appel au composant FragmentManager de remplacer son contenu par une nouvelle instance de LoginFragment. Le fait de supprimer le code suivant de la méthode onCreate l'a résolu

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

Explication supplémentaire puisque cela m'a fait me gratter la tête pendant quelques minutes:

Vous pouvez créer NavHostFragment par programme en utilisant ce code à partir du message de l'OP et répondre ou vous pouvez mettre app:defaultNavHost="true" dans le fragment de votre activité principale.

Android Studio crée de ces deux manières lorsque vous créez des fichiers de raccord. Si vous supprimez le code de OP ou cette propriété, cela fonctionnera.

0
IsiSku