无法从XML访问NavHostFragment

Nom*_*sta 7 android android-fragments kotlin android-architecture-components android-architecture-navigation

我想尝试新的导航库.遵循本指南后,我在运行时遇到错误:

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
Run Code Online (Sandbox Code Playgroud)

在资源文件中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>
Run Code Online (Sandbox Code Playgroud)

我查看了源代码,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"
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在使用AndroidX中除了Navigation之外的库,因为它可能尚未迁移.在谷歌唯一的地方,我能找到的androidx.navigation在这里.不幸的是,Gradle无法下载它.

编辑

我也在里面启用了jetifier工具gradle.properties.

android.enableJetifier=true
android.useAndroidX=true
Run Code Online (Sandbox Code Playgroud)

更新

它已在Android Studio 3.2 Canary 17中修复,如本答案中所述.不要忘记使缓存无效并重新启动以删除代码中的警告.

Ade*_*sna 7

我也很头痛,因为我正在关注https://codelabs.developers.google.com/codelabs/kotlin-android-training-add-navigation/index.html#3上的 Android Kotlin 基础教程 这是有效的代码为我

<androidx.fragment.app.FragmentContainerView
        android:id="@+id/myNavHostFragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:navGraph="@navigation/navigation"
        app:defaultNavHost="true"/>
Run Code Online (Sandbox Code Playgroud)

显然教程还没有更新。另外在依赖项中需要更新库..

....    
implementation "androidx.navigation:navigation-fragment:2.3.0"
implementation "androidx.navigation:navigation-ui:2.3.0"
Run Code Online (Sandbox Code Playgroud)

我使用的是Android Studio 4.0。

  • 抱歉我的回答不正确。就我而言,请勿按照 Android Studio 的建议将 XML 文件中的 &lt;fragment 更改为 &lt;androidx.fragment.app.FragmentContainerView。我发现我没有添加正确的依赖项。确保片段和 ui 都以 ktx 结尾,例如。fragment-ktx:$version 和 ui-ktx:$version。花了一天时间才解决这个问题。谷歌绝对应该更新他们的教程。好的一面是我学会了如何解决问题,并且主要是由依赖性引起的。 (2认同)

ayu*_*h b 5

NavHostFragment不可访问?android:name="androidx.navigation.fragment.NavHostFragment

所以在你的中build.gradle,只需添加这两个依赖项 -

对于 Java:-

dependencies {
def nav_version = "2.3.0"

implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"

}
Run Code Online (Sandbox Code Playgroud)

对于科特林:-

dependencies {
def nav_version = "2.3.0"

implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

}
Run Code Online (Sandbox Code Playgroud)

参考链接:- https://developer.android.com/jetpack/androidx/releases/navigation


Ilo*_*squ 4

是的,正如 Levi Albuquerque 提到的,这是最新 Canary Android Studio 版本 (14) 中的一个已知错误。您可以在此处投票、订阅并提供一些有用的信息。

更新:

问题将在 Android Gradle 插件 3.2.0-alpha17 中修复