【问题标题】:Android Navigation java.language.IllegalStateException fragment class was not setAndroid Navigation java.language.IllegalStateException 片段类未设置
【发布时间】: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_width="match_parent"
            android:layout_height="match_parent">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:context=".MainActivity">

                <androidx.fragment.app.FragmentContainerView
                    android:id="@+id/myNavHostFragment"
                    android:name="androidx.navigation.fragment.NavHostFragment"
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    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_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                app:headerLayout="@layout/nav_header"
                app:menu="@menu/nav_drawer_menu" />
        </androidx.drawerlayout.widget.DrawerLayout>
    </merge>
</layout>

【问题讨论】:

  • 请在您定义NavHostFragment的地方添加代码。
  • 添加NavHostFragement的代码。

标签: android kotlin android-fragments navigation-drawer


【解决方案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

    【讨论】:

      猜你喜欢
      • 2014-01-11
      • 1970-01-01
      • 2021-05-20
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2021-07-04
      • 1970-01-01
      相关资源
      最近更新 更多