无法从XML

时间:2018-05-14 14:55:16

标签: android android-fragments kotlin android-architecture-components android-architecture-navigation

我想尝试新的导航库。在关注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

更新

this answer中所述,它已在Android Studio 3.2 Canary 17中修复。不要忘记使缓存失效并重新启动,以便删除代码中的警告。

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

<强>更新

问题将在Android Gradle插件3.2.0-alpha17

中修复

答案 2 :(得分:1)

显然,请参阅herehere,Jetifier和Android X的使用仍处于重构状态,在这次google i/o讲话中他们要求我们等待Canary 15有一些错误修复。

现在尝试将导航库与旧的支持库一起使用。

修改 Android Studio 3.2 Canary 15可供下载,一切正常,可用于导航库。安装完成后,清理杂乱无效的缓存以查看是否正常。

答案 3 :(得分:1)

我也很头疼,因为我正在关注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。

答案 4 :(得分:0)

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

项目树

答案 5 :(得分: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"
}