无法从 XML 访问 NavHostFragment
NavHostFragment not accessible from XML
我想尝试新的导航库。在关注 this guideline 之后,我在运行时遇到错误:
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 中的库,导航除外,因为它可能尚未迁移。在 Google 上我唯一能找到 androidx.navigation
的地方是 here。很遗憾 Gradle 无法下载它。
编辑
我的 gradle.properties
.
中也启用了 jetifier 工具
android.enableJetifier=true
android.useAndroidX=true
更新
它已在 Android Studio 3.2 Canary 17 中修复,如 中所述。不要忘记使缓存无效并重新启动以删除代码中的警告。
显然,请参阅 here and here, the use of the Jetifier and Android X is still under refactor, In this google i/o 谈话,他们要求我们等待 Canary 15,它修复了一些错误。
暂时尝试将导航库与旧支持库一起使用。
编辑:
Android Studio 3.2 Canary 15 可供下载,导航库一切正常。完成安装后,清理使缓存无效的混乱情况,看看它是否正常。
是的,正如 Levi Albuquerque 所提到的,这是最新 Canary Android Studio 版本 (14) 中的一个已知错误。您可以投票给这个错误,订阅并提供一些有用的信息here。
更新:
问题将在 Android Gradle 插件 3.2.0-alpha17
中修复
在导航文件夹下,有一个名为 nav_graph.xml
的 XML 文件。打开会提示Gradlesync.
项目树
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"
}
对于科特林:-
dependencies {
def nav_version = "2.3.0"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
参考资料Link:-
https://developer.android.com/jetpack/androidx/releases/navigation
从 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"
}
我也很头疼,因为我正在关注 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"/>
好像教程没有更新。同样在依赖中需要更新库..
....
implementation "androidx.navigation:navigation-fragment:2.3.0"
implementation "androidx.navigation:navigation-ui:2.3.0"
我正在使用 Android Studio 4.0。
对我来说这是一个奇怪的 Android Studio 错误; NavHostFragment
直到:
才得到解决
- 禁用缓存并重新启动 >> 仍未解决
- 手动添加
NavHostFragment
导入 import androidx.navigation.fragment.NavHostFragment
我想尝试新的导航库。在关注 this guideline 之后,我在运行时遇到错误:
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 中的库,导航除外,因为它可能尚未迁移。在 Google 上我唯一能找到 androidx.navigation
的地方是 here。很遗憾 Gradle 无法下载它。
编辑
我的 gradle.properties
.
android.enableJetifier=true
android.useAndroidX=true
更新
它已在 Android Studio 3.2 Canary 17 中修复,如
显然,请参阅 here and here, the use of the Jetifier and Android X is still under refactor, In this google i/o 谈话,他们要求我们等待 Canary 15,它修复了一些错误。
暂时尝试将导航库与旧支持库一起使用。
编辑: Android Studio 3.2 Canary 15 可供下载,导航库一切正常。完成安装后,清理使缓存无效的混乱情况,看看它是否正常。
是的,正如 Levi Albuquerque 所提到的,这是最新 Canary Android Studio 版本 (14) 中的一个已知错误。您可以投票给这个错误,订阅并提供一些有用的信息here。
更新:
问题将在 Android Gradle 插件 3.2.0-alpha17
中修复在导航文件夹下,有一个名为 nav_graph.xml
的 XML 文件。打开会提示Gradlesync.
项目树
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"
}
对于科特林:-
dependencies {
def nav_version = "2.3.0"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
参考资料Link:- https://developer.android.com/jetpack/androidx/releases/navigation
从 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"
}
我也很头疼,因为我正在关注 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"/>
好像教程没有更新。同样在依赖中需要更新库..
....
implementation "androidx.navigation:navigation-fragment:2.3.0"
implementation "androidx.navigation:navigation-ui:2.3.0"
我正在使用 Android Studio 4.0。
对我来说这是一个奇怪的 Android Studio 错误; NavHostFragment
直到:
- 禁用缓存并重新启动 >> 仍未解决
- 手动添加
NavHostFragment
导入import androidx.navigation.fragment.NavHostFragment