繁体   English   中英

kotlin.TypeCastException:null 无法在 NavigationExtensionsKt 转换为非空类型 androidx.navigation.fragment.NavHostFragment

[英]kotlin.TypeCastException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment at NavigationExtensionsKt

例外

我从 NavigationAdvancedSample 复制了 NavigationExtensions.kt 扩展文件,我得到了这个异常:

更新:确保您的菜单项 ID 与您的导航资源文件 ID 相同

另外:如果您在使用 ItemReselectedListener Add null 安全检查时遇到问题,您的监听器应该是这样的:

setOnNavigationItemReselectedListener { item ->
        val newlySelectedItemTag = graphIdToTagMap[item.itemId]
        val selectedFragment = fragmentManager.findFragmentByTag(newlySelectedItemTag)
                as NavHostFragment?
        val navController = selectedFragment?.navController
        // Pop the back stack to the start destination of the current navController graph
        navController?.popBackStack(
            navController.graph.startDestination, false
        )
    }

我也遇到过这个问题,解决方法其实很简单。

确保您的菜单项的 id 与 NAV_GRAPH 而不是目的地的 id 匹配。

我对菜单项和目的地使用了相同的 id,但在这种情况下,菜单项应该具有与 NAV_GRAPH 相同的 id。

就我而言,我忘了在 FragmentContainerView 中添加 android:name="androidx.navigation.fragment.NavHostFragment"

我也有同样的问题

检查您是否已设置起始目的地并将其附加到片段。 在您的导航图中设置 app:startDestination="@id/your fragment"

这应该可以解决您的问题

我设法解决了这个问题。

就我而言,我在setContentView(binding.root) binding.root) 之前将val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment ,所以我更改了方法的顺序,一切正常。

所以对我来说,在我的导航图文件中,我声明的 id

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/my_id"
    app:startDestination="@id/container">
 ....

与菜单项的名称不同

<item
        android:id="@+id/my_idd"
        android:enabled="true"
        android:icon="@drawable/icon"
        android:title="@string/test_title" />

将两者的 id 更改为相同解决了问题

我已经解决了这个问题,实际上,我在 setcontentView 中为此活动设置了另一个布局,当我设置原始布局时它起作用了。

我设法解决了这个问题。

在我的例子中,我在 setContentView(binding.root) 之前调用 val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) 作为 NavHostFragment 所以我改变了方法的顺序,一切都很好。

这对我有帮助。

你可以试试这个吗?

val selectedFragment: NavHostFragment? = fragmentManager.findFragmentByTag(newlySelectedItemTag) as NavHostFragment

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM