为啥我的应用程序崩溃调用“setupActionBarWithNavController(navController,appBarConfiguration)”

Posted

技术标签:

【中文标题】为啥我的应用程序崩溃调用“setupActionBarWithNavController(navController,appBarConfiguration)”【英文标题】:Why does my app crash invoking "setupActionBarWithNavController(navController, appBarConfiguration)"为什么我的应用程序崩溃调用“setupActionBarWithNavController(navController,appBarConfiguration)” 【发布时间】:2020-03-10 16:02:15 【问题描述】:

我在 android Studio 的 LogCat 窗口中收到一条错误消息;

Process: com.riverstonetech.gositeuk, PID: 27370
    java.lang.RuntimeException: Unable to start activity ComponentInfocom.riverstonetech.gositeuk/com.riverstonetech.gositeuk.CountriesActivity: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference
        at androidx.navigation.ui.ActionBarOnDestinationChangedListener.setTitle(ActionBarOnDestinationChangedListener.java:48)
        at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.onDestinationChanged(AbstractAppBarOnDestinationChangedListener.java:100)
        at androidx.navigation.NavController.addOnDestinationChangedListener(NavController.java:218)
        at androidx.navigation.ui.NavigationUI.setupActionBarWithNavController(NavigationUI.java:220)
        at androidx.navigation.ui.ActivityKt.setupActionBarWithNavController(Activity.kt:74)
        at com.riverstonetech.gositeuk.CountriesActivity.onCreate(CountriesActivity.kt:31)
        at android.app.Activity.performCreate(Activity.java:6679)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

当我运行包含以下代码的应用程序时:

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_countries)

    val navView: BottomNavigationView = findViewById(R.id.nav_view)

    val navController = findNavController(R.id.nav_host_fragment)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.

    val appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.englandFragment, R.id.scotlandFragment, R.id.walesFragment, R.id.nirelandFragment
        )
    )

    setupActionBarWithNavController(navController, appBarConfiguration)

    navView.setupWithNavController(navController)


应用到达线路时崩溃;

    setupActionBarWithNavController(navController, appBarConfiguration)

【问题讨论】:

你检查过 logcat 的异常堆栈跟踪吗? 我应该在异常堆栈跟踪中寻找什么? 主要是崩溃的原因。如果你不能真正解析它,那么它应该附加到问题中,以便我们可以看到它。在这种情况下,崩溃似乎是导航助手调用的内部问题,所以我肯定很想知道他们实际在哪里调用 actionBar.setTitle 添加了异常堆栈跟踪 【参考方案1】:

听起来您为自己的 Activity 设置了一个主题,其中包含 .NoActionBar

使用操作栏的更安全的解决方案是使用 Toolbar 作为布局的一部分,然后使用 setupWithNavController(Toolbar toolbar, NavController navController, AppBarConfiguration configuration)

如果您确实想使用操作栏,那么您的活动需要一个提供操作栏的主题。检查您的 AndroidManifest.xml 和 styles.xml。

【讨论】:

我不知道。您能否引导我访问可以了解操作栏和主题的在线资源? 官方文档已经过时(引用 Holo 和其他东西),请查看这篇文章:antonioleiva.com/material-design-everywhere 谢谢,但我想我需要更多有关 Android 导航的基本信息,因为我刚刚学习 Android 应用程序构建。 啊,Jetpack Navigation 相当新(您似乎正在使用它),所以您可能想看看developer.android.com/guide/navigation/…,因为我个人不使用它(我使用底层机制相反,因为我不需要图形编辑器)。不过,我希望文档能很好地描述它。【参考方案2】:

如果您不想使用操作栏。删除以下代码

setupActionBarWithNavController(navController, appBarConfiguration)

或者将 NoActionBar 更改为 DarkActionBar 或任何其他。

【讨论】:

【参考方案3】:

我遇到了同样的问题并解决了问题。我希望这有帮助。 问题是我没有为片段库添加依赖项。

    在应用级别 build.gradle 上添加片段依赖项。 实现'androidx.fragment:fragment:1.2.4' 实现'androidx.fragment:fragment-ktx:1.2.4'

    清理构建(构建 -> 清理项目)

    使缓存无效并重新启动(如果开发人员 PC 操作系统是 Windows)

    重启电脑(不知道为什么。但是如果我不重启电脑,问题又出现了。)

    重启后,再次构建并运行应用程序。

【讨论】:

【参考方案4】:

setupActionBarWithNavController() 方法假设您有一个 ActionBar。 在您的代码中,您没有调用setSupportActionBar(),如果您使用的是.NoActionBar 主题,则没有ActionBar

只需在布局中使用Toolbar 并使用:

override fun onCreate(savedInstanceState: Bundle?) 
  //..
  setContentView(R.layout.activity_countries)
  val toolbar = findViewById<Toolbar>(R.id.toolbar)
  setSupportActionBar(toolbar)
  //...
  setupActionBarWithNavController(navController, appBarConfiguration)
  //..

【讨论】:

【参考方案5】:

安卓 JAVA

选项 1: 更改 Manifest 上的 Activity AppTheme 或在 styles.xml 上添加新样式并应用于活动

选项 2: 像这样将操作栏添加到布局文件:

<com.google.android.material.appbar.AppBarLayout
    android:layout_
    android:layout_
    android:theme="@style/AppTheme.AppBarOverlay">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</com.google.android.material.appbar.AppBarLayout>

在 setContentView() 之后的 Activity 上添加这个:

 Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

享受

【讨论】:

以上是关于为啥我的应用程序崩溃调用“setupActionBarWithNavController(navController,appBarConfiguration)”的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的应用程序一直崩溃而没有任何错误?

为啥 Windows 10 UWP 应用程序由于调用了为不同线程编组的接口而崩溃?

我的程序崩溃了,我不知道为啥

为啥我的相机应用程序崩溃了?

我的启动画面后我的程序不断崩溃。为啥?

为啥意图使我的应用程序崩溃?