尝试调用空对象引用上的'androidx.navigation.NavGraph androidx.navigation.NavDestination.getParent()'虚拟方法

4
我创建了一个Android应用程序,并从库中添加了“导航抽屉活动”,我删除和重命名了菜单项。在启动应用程序后,当我点击抽屉活动中的任何菜单项时,出现以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.navigation.NavGraph androidx.navigation.NavDestination.getParent()' on a null object reference
        at androidx.navigation.ui.NavigationUI.onNavDestinationSelected(NavigationUI.java:78)
        at androidx.navigation.ui.NavigationUI$3.onNavigationItemSelected(NavigationUI.java:453)
        at com.google.android.material.navigation.NavigationView$1.onMenuItemSelected(NavigationView.java:215)
        at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:834)
        at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
        at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:985)
        at com.google.android.material.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:416)
        at android.view.View.performClick(View.java:7448)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

主活动代码:
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    private lateinit var appBarConfiguration: AppBarConfiguration

    private lateinit var navView: NavigationView

    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initView()
    }

    private fun initView() {
        setContentView(R.layout.activity_main)

        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)
        initFab()

        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        navView = findViewById(R.id.main_nav_view)
        val navController = findNavController(R.id.nav_host_fragment)

        navView.setNavigationItemSelectedListener(this)

        appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.nav_category_list
            ),
            drawerLayout
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

    private fun initFab() {
        val fab: FloatingActionButton = findViewById(R.id.fab)
        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()
        }
    }

    ...
}

values-night/themes.xml:

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.MyMenuApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_200</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/black</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_200</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>
</resources>

values/themes.xml:

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.MyMenuApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>

    <style name="Theme.MyMenuApplication.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="Theme.MyMenuApplication.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

    <style name="Theme.MyMenuApplication.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>

导航:

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/main_navigation"
    app:startDestination="@+id/nav_category_list">

    <fragment
        android:id="@+id/nav_category_list"
        android:name="hu.myapp.activity.main.fragment.category.CategoryFragment"
        android:label="@string/fragment_category_item_list_title"
        tools:layout="@layout/fragment_category_item_list" />

</navigation>

菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigation_view">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_category_list"
            android:icon="@drawable/ic_account_balance_24"
            android:title="@string/menu_accounts"
            />

    </group>
</menu>

调试窗口:

enter image description here

在“androidx.navigation.NavGraph androidx.navigation.NavDestination.getParent()”中,什么会导致空指针异常?


请分享导航图。 - Zain
那么你的菜单项ID是否与图表中的ID匹配? - ianhanniballake
6个回答

7

我已经解决了,在我的片段标签中缺少app:navGraph(在布局中)。我添加了它,这解决了空指针异常。

<fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
...
        app:navGraph="@navigation/main_navigation"/>

5
尝试降级导航实现,因为2.3.2版本存在一些问题。
implementation 'androidx.navigation:navigation-fragment:2.3.1'
implementation 'androidx.navigation:navigation-ui:2.3.1'

这个答案解决了我的问题,但是我想知道你是怎么得出这样的答案的。我的意思是,你是在文档和发行说明中找到的还是其他地方... 我只是好奇。 - Hossein Farrokhi
我的是KTX版本2.5.1,这个解决方案在2022年仍然有效。我不知道为什么Android Studio如此容易出错。 - NimaAzhd

1
由于在组合层次结构中有两个不同的NavControllers,因此我遇到了这个错误,这是由于具有navController参数的可组合项而导致的: navController: NavController = rememberNavController() 但没有将其设置为公共的、单一的根navController。

嗨,丹,我认为我有同样的问题。你所说的将其设置为常见的单个根navController是什么意思?你写了什么? :) - Kes Walker
我在 setContent { 处使用了 navController = rememberNavController(),但由于忘记将 navController 传递给组合函数,导致最终出现了不同的 navController。记录你的 navController 实例并检查它们是否是相同的实例。如果它们都是相同的,则你有一个不同的问题。 - Dan Brough

0

我有

app:launchSingleTop="true"

在我的操作中

        <action
        android:id="@+id/action_confirmation_to_home_page"
        app:destination="@id/nav_graph_home"
        app:launchSingleTop="true"
        app:popUpTo="@id/home_page_fragment"
        app:popUpToInclusive="true" />

我把它移除了,问题解决了。


0

我之所以得到这个结果,是因为我设置了popUpTo我的第一个Fragment,并且在按下返回键时处理了popBackStack。


0

我有同样的问题,我忘记在片段类中初始化变量navController。

private NavController navController;

所以我在我的onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)中添加了代码

navController = Navigation.findNavController(view);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接