web-dev-qa-db-ja.com

NavHostFragmentはXMLからアクセスできません

新しいナビゲーションライブラリを試したかった。次のように このガイドライン 実行時にエラーが発生しました:

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

リソースファイルactivity_home.xml内。このファイルは非常に単純です:

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

私はNavHostFragmentのソースコードを見て、アプリケーション全体がAndroid.support.v4.app.Fragmentを使用しているのにandroidx.fragment.app.Fragmentを使用していることに気付きました。

これが問題であるとは確信していませんが、以下の依存関係の一部を含めています。

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

ご覧のとおり、私はナビゲーション以外のAndroidXのライブラリを使用しています。おそらくまだ移行されていないためです。私がandroidx.navigationを見つけることができるGoogleでの唯一の場所は here です。残念ながら、Gradleはダウンロードできません。

編集

また、gradle.properties内でJetifierツールを有効にしています。

Android.enableJetifier=true
Android.useAndroidX=true

更新

これは、Android Studio 3.2 Canary 17 in this answer )で修正されています。コードの警告を削除するには、キャッシュを無効にして再起動することを忘れないでください。

8
Nominalista

はい、Levi Albuquerqueが述べたように、これは最新のCanary Android Studioリリース(14)の既知のバグです。このバグに投票して、サブスクライブし、いくつかの有用な情報を提供できます here

更新:

問題はAndroid Gradle plugin 3.2.0-alpha17で修正されます

2
Ilosqu

NavHostFragmentにアクセスできませんか?Android:name="androidx.navigation.fragment.NavHostFragment

Answerこれをbuild.gradleに追加します

implementation "androidx.navigation:navigation-fragment-ktx:2.1.0-alpha05"
implementation "androidx.navigation:navigation-ui-ktx:2.1.0-alpha05"
2
ayush b

どうやら、 ここここ を参照してください。JetifierとAndroid Xの使用はまだリファクタリング中です。この google i/o いくつかのバグ修正が施されたCanary 15がリリースされるのを待つように言われました。

とりあえず、古いサポートライブラリでナビゲーションライブラリを使用してみてください。

編集:Android Studio 3.2 Canary 15がダウンロード可能になり、すべてがナビゲーションライブラリで正常に動作します。インストールが完了し、キャッシュが正常に機能するかどうかを確認するために、キャッシュを無効にして混乱を解消しました。

1
Levi Moreira

ナビゲーションフォルダーの下に、nav_graph.xmlというXMLファイルがあります。それを開くと、Gradleの同期を促します。

プロジェクトツリー

0
Aust L