为什么我的应用程序在调用“setupActionBarWithNavController(navController,appBarConfiguration)”时会崩溃?

8

我在Android Studio的LogCat窗口中收到了一个错误消息;

Process: com.riverstonetech.gositeuk, PID: 27370
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.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以查找异常堆栈跟踪吗? - EpicPandaForce
在异常堆栈跟踪中,我应该寻找什么? - user7142686
主要是崩溃的原因。如果你无法真正解析它,那么应该将其附加到问题中,以便我们可以看到它。在这种情况下,崩溃似乎是由导航助手调用引起的内部问题,所以我肯定很想知道他们实际上在哪里调用了 actionBar.setTitle - EpicPandaForce
异常堆栈跟踪已添加。 - user7142686
5个回答

15

看起来您的Activity已设置了一个带有.NoActionBar的主题。

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

如果确实要使用操作栏,则您的Activity需要提供ActionBar的主题。请检查AndroidManifest.xml和styles.xml。


我不知道。你能指导我去哪个在线资源学习关于操作栏和主题的知识吗? - user7142686
官方文档已经过时了(涉及到Holo等),请查看这篇文章:https://antonioleiva.com/material-design-everywhere/ - EpicPandaForce
谢谢,但我认为我需要更基础的关于Android导航的信息,因为我刚开始学习Android应用程序开发。 - user7142686
啊,Jetpack Navigation 是相当新的(这似乎是你正在使用的),所以你可能想看一下 https://developer.android.com/guide/navigation/navigation-getting-started,因为我个人不使用它(我使用底层机制,因为我不需要图形编辑器)。我希望文档描述得很好。 - EpicPandaForce

7

如果你不想使用操作栏,请删除下面的代码

setupActionBarWithNavController(navController, appBarConfiguration)

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


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)
  //..
}

2

我曾经遇到了同样的问题并解决了它。希望这能帮到你。

  1. 在 app level 的 build.gradle 文件中添加 fragment 依赖项。 implementation 'androidx.fragment:fragment:1.2.4' implementation 'androidx.fragment:fragment-ktx:1.2.4'

  2. 进行 Clean build(Build -> Clean Project)

  3. 无效缓存并重新启动(如果开发者 PC 的操作系统是 Windows)

  4. 重新启动电脑(我不知道为什么,但如果我不重新启动电脑,问题会再次出现。)

  5. 重启后,再次构建和运行应用程序。


2

安卓JAVA

选项1: 在Manifest文件中更改Activity的AppTheme或者在styles.xml中添加新的样式并应用到Activity上。

选项2: 在Layout文件中添加Action Bar,如下所示:

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

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

在setContentView()之后的Activity中添加以下内容:
 Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

享受


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