NavHostFragment在XML中不可访问。

11

我想尝试新的导航库。按照这个指南操作后,我在运行时遇到了错误:

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库,除了Navigation以外,因为它可能还没有迁移。我能在Google上找到androidx.navigation的唯一位置是这里。不幸的是,Gradle无法下载它。

编辑

我还在我的gradle.properties中启用了jetifier工具。

android.enableJetifier=true
android.useAndroidX=true

更新

此答案所述,问题已在Android Studio 3.2 Canary 17中得到解决。请不要忘记使缓存失效并重新启动以去除代码中的警告。


1
同样的问题。我认为这与androidx和support库冲突有关,但我不确定。 - der_Fidelis
1
大家好!当我在主活动的布局中使用 Android Studio 推荐的 FragmentContainerView 代替 fragment xml 元素时,遇到了相同的问题:“在 mainActivity 和 Navigation 中找不到 NavHostFragment”。我回到了 fragment,现在一切都正常了。Gradle 4.0.1 Navigation 版本为 2.3.0。 - Leontsev Anton
8个回答

7

我正在遵循Android Kotlin基础教程,但是我也遇到了这个头疼的问题。教程链接在https://codelabs.developers.google.com/codelabs/kotlin-android-training-add-navigation/index.html#3,以下是对我有效的代码。

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

显然,该教程尚未更新。此外,在依赖项中需要更新库..

....    
implementation "androidx.navigation:navigation-fragment:2.3.0"
implementation "androidx.navigation:navigation-ui:2.3.0"

我正在使用 Android Studio 4.0。


2
抱歉我的答案不正确。在我的情况下,不要像Android Studio建议的那样将XML文件中的<fragment更改为<androidx.fragment.app.FragmentContainerView。我发现我没有添加正确的依赖项。确保片段和UI都以ktx结尾,例如:fragment-ktx:$version和ui-ktx:$version。我花了一天时间解决这个问题。Google肯定应该更新他们的教程。好的一面是我学会了如何解决这个问题,而且大多数原因是由于依赖关系。 - Ade Trisna

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"

}

对于Kotlin:

dependencies {
def nav_version = "2.3.0"

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

}

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

该链接是与Android开发相关的导航库信息。

1
已添加但仍未找到NavHostFragment。 - Md Imran Choudhury

4

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

更新:

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


1

显然,根据这里这里,Jetifier和Android X的使用仍在重构中,在Google i/o的讲话中,他们要求我们等待Canary 15,其中包含一些错误修复。

暂时尝试使用旧的支持库与导航库进行导航。

编辑: Android Studio 3.2 Canary 15可供下载,导航库一切正常。安装完成后,请清除无效缓存以查看是否正常。


经过一些调查,我发现了这个问题。显然,在Canary 14中发现了一些错误,并且将在Canary 15中发布一些修复程序。 - Levi Moreira
1
升级到Canary 15后,我仍然无法使用此库。打开应用程序后,它会崩溃。它说找不到android.support.v4.app.Fragment。我以为jetifier应该能处理这个问题。 - Nominalista
应该是的,你是否已经使缓存失效并重新启动了? - Levi Moreira
清除缓存没有帮助。我该如何更改NavHostFragment内部的导入? - Nominalista
请参考@Ilosqu的回答中提到的问题。 - Nominalista
显示剩余3条评论

1

对我来说,这是一个奇怪的Android Studio错误;直到以下步骤之后NavHostFragment才得以解决:

  • 使缓存无效并重新启动 >> 仍未解决
  • 手动添加NavHostFragment导入 import androidx.navigation.fragment.NavHostFragment

0
在导航文件夹下,有一个名为nav_graph.xml的XML文件。打开它,它会提示Gradle同步。
项目树


0

Android Developers添加依赖项对我很有帮助:

dependencies {
   def nav_version = "2.3.0-rc01"

  // Java language implementation
  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"

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

  // Dynamic Feature Module Support
  implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

  // Testing Navigation
  androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"
}

0
对我来说,以上的答案都没有起作用。
val navController = Navigation.findNavController(this, R.id.navHostFragment)

你需要像这样找到导航控制器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接