Android Navigation java.language.IllegalStateException 片段类未设置

Posted

技术标签:

【中文标题】Android Navigation java.language.IllegalStateException 片段类未设置【英文标题】:Android Navigation java.language.IllegalStateException fragment class was not set 【发布时间】:2021-05-24 21:33:11 【问题描述】:

Navigation Drawer

在这里,当我单击“已保存的结果”时,它会显示所有带有日期的已保存结果。 The image showing saved results in SavedResultsFragment Navigation Layout

当我点击任何项目时,它应该在ShowSavedResltsFragment 中显示该点击项目的所有详细信息,但在状态下应用程序崩溃并且IllegalStateException 引发了片段类未设置。

The image showing navigation layout and code The image showing code logic where trying to switch to ShowResultsFragment from SavedResultFragment

我正在使用安全参数,当我尝试在 SavedResultFragmentShowSavedResultsFragment 之间导航时,我遇到了所有问题。我试图搜索官方文档和 Stack Overflow,但没有找到我所面临的任何东西。官方文档提示 navHostfragment 未正确实现,然后这可能会触发上述异常,但我正在使用他们的官方文档,但我在这里所做的唯一事情是通过 Navigation Drawer 导航到 Fragment,然后从该片段尝试导航到另一个片段,这就是它中断的地方。

Image showing exception 编辑:NavHostFragment 代码

<?xml version="1.0" encoding="utf-8"?>

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

    <data>

    </data>

    <merge>
        <androidx.drawerlayout.widget.DrawerLayout
            android:id="@+id/drawerLayout"
            android:layout_
            android:layout_>

            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_
                android:layout_
                tools:context=".MainActivity">

                <androidx.fragment.app.FragmentContainerView
                    android:id="@+id/myNavHostFragment"
                    android:name="androidx.navigation.fragment.NavHostFragment"
                    android:layout_
                    android:layout_
                    app:defaultNavHost="true"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:navGraph="@navigation/navigation" />

            </androidx.constraintlayout.widget.ConstraintLayout>

            <com.google.android.material.navigation.NavigationView
                android:id="@+id/navVew"
                android:layout_
                android:layout_
                android:layout_gravity="start"
                app:headerLayout="@layout/nav_header"
                app:menu="@menu/nav_drawer_menu" />
        </androidx.drawerlayout.widget.DrawerLayout>
    </merge>
</layout>

【问题讨论】:

请在您定义NavHostFragment的地方添加代码。 添加NavHostFragement的代码。 【参考方案1】:

这是 Fragment 的 findNavController() 文档 - "Calling this on a Fragment that is not a [NavHostFragment] or within a [NavHostFragment] will result in an [IllegalStateException]" 中给出的内容。换成

 Navigation.findNavController(requireActivity(), R.id.myNavHostFragment)
                        .navigate(..)

【讨论】:

我很感激,但它没有奏效。它给出了与未设置 Fragrant 类相同的异常。编辑 是否有任何限制,比如我试图通过抽屉布局从另一个片段交换片段,这可能是导致该错误的原因吗?【参考方案2】:

ShowSavedResultsFragment 中存在一个错误,因此引发了异常。 我仍然无法弄清楚那个错误在哪里,所以我删除了片段和关联的视图模型并重新创建它们,异常没有再次引发,一切正常。 编辑:我没有引入真正的错误,但是我已经更改了类名,并且这种类型的事情可能会引发异常,因为在引擎盖下 IDE 会自行映射和生成类名并将它们链接起来,因此使缓存无效并重建项目会有帮助。

【讨论】:

【参考方案3】:

导航图中的ShowSavedResultsFragment 声明没有附加name 属性。

如果您查看SavedResultFragment 声明,您会注意到它有一个name 属性。

name 属性添加到您的ShowSavedResultsFragment 声明中。 name 属性的值应该是ShowSavedResultsFragment 类的包名。(点)类的名称。类似com.xxx.yyy.savedresult.ShowSavedResultsFragment

【讨论】:

以上是关于Android Navigation java.language.IllegalStateException 片段类未设置的主要内容,如果未能解决你的问题,请参考以下文章

Android jetpack Navigation的简单使用

Android开发 navigation的跳转动画实现

Android Navigation 详解

Android Navigation 详解

Android Jetpack之Navigation源码分析

Android日志—Navigation