web-dev-qa-db-fra.com

NavHostFragment non accessible à partir de XML

Je voulais essayer une nouvelle bibliothèque de navigation. Après avoir suivi cette directive j'ai rencontré une erreur au moment de l'exécution:

Caused by: Android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class fragment
Caused by: Android.view.InflateException: Binary XML file line #11: Error inflating class fragment
Caused by: Android.app.Fragment$InstantiationException: Unable to instantiate fragment androidx.navigation.fragment.NavHostFragment: make sure class name exists, is public, and has an empty constructor that is public

dans le fichier de ressources activity_home.xml. Ce fichier est très simple:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".ui.home.HomeActivity">

    <fragment
        Android:id="@+id/fragment_navigation_Host"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation_home" />

</FrameLayout>

J'ai regardé le code source de NavHostFragment et j'ai remarqué qu'il utilise Android.support.v4.app.Fragment tandis que l'ensemble de mon application utilise androidx.fragment.app.Fragment

Je ne suis pas convaincu que ce soit le problème, mais j'inclus ci-dessous certaines de mes dépendances:

// AndroidX
implementation     "androidx.appcompat:appcompat:$appCompatVersion"
implementation     "androidx.constraintlayout:constraintlayout:$constraintLayoutVersion"
implementation     "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion"
implementation     "androidx.recyclerview:recyclerview:$recyclerViewVersion"
implementation     "androidx.room:room-runtime:$roomVersion"
implementation     "androidx.room:room-rxjava2:$roomVersion"

kapt               "androidx.room:room-compiler:$roomVersion"

// Navigation
implementation     "Android.Arch.navigation:navigation-fragment-ktx:$navigationVersion"
implementation     "Android.Arch.navigation:navigation-ui-ktx:$navigationVersion"

Comme vous pouvez le constater, j'utilise les bibliothèques d'AndroidX sauf Navigation, car ce n'est probablement pas encore migré. Le seul endroit sur Google où je peux trouver androidx.navigation est ici . Malheureusement, Gradle ne parvient pas à le télécharger.

Modifier

J'ai également un outil de jetifier activé dans mon gradle.properties.

Android.enableJetifier=true
Android.useAndroidX=true

Mise à jour

Il est corrigé dans Android Studio 3.2 Canary 17 comme indiqué dans cette réponse . N'oubliez pas d'invalider le cache et de redémarrer afin de supprimer les avertissements dans le code.

5
Nominalista

Oui, comme l'a mentionné Levi Albuquerque, il s'agit d'un bogue connu dans la dernière version de Canary Android Studio (14). Vous pouvez voter sur ce bogue, vous abonner et fournir des informations utiles ici .

Mise à jour:

Le problème sera corrigé dans le plugin Android Gradle 3.2.0-alpha17

2
Ilosqu

Apparemment, voir ici et ici , l'utilisation de Jetifier et d'Android X est toujours en cours de refactorisation. Dans cette conversation google i/o qu'ils nous ont demandée attendre Canary 15 qui a quelques corrections de bugs.

Essayez d'utiliser la bibliothèque de navigation avec l'ancienne bibliothèque de support pour l'instant.

Edit: Android Studio 3.2 Canary 15 est disponible au téléchargement, tout fonctionne correctement pour la bibliothèque de navigation. Une fois que vous avez terminé l’installation, éliminez le fouillis qui empêche le cache de vérifier si tout se passe bien. 

1
Levi Moreira