Android 为什么我的应用程序调用时崩溃;setupActionBarWithNavController(navController、appBarConfiguration)";

Android 为什么我的应用程序调用时崩溃;setupActionBarWithNavController(navController、appBarConfiguration)";,android,kotlin,nullpointerexception,android-actionbar,android-architecture-navigation,Android,Kotlin,Nullpointerexception,Android Actionbar,Android Architecture Navigation,我在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.NullPoint

我在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)


听起来您的活动有一个主题集,它包含
.NoActionBar

使用操作栏的一个更安全的解决方案是使用
工具栏作为布局的一部分,然后使用
setupWithNavController(工具栏、NavController、NavController、AppBarConfiguration配置)


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

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

  • 在应用程序级别build.gradle上添加片段依赖项。 实现“androidx.fragment:fragment:1.2.4” 实现“androidx.fragment:fragment ktx:1.2.4”

  • 清理生成(生成->清理项目)

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

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

  • 重新启动后,再次构建并运行应用程序


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

    setupActionBarWithNavController(navController, appBarConfiguration)
    

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

    方法
    setupActionBarWithNavController()
    假定您有一个
    操作栏

    在您的代码中,您没有调用
    setSupportActionBar()
    ,如果您使用的是
    .NoActionBar
    主题,您就没有
    ActionBar

    只需在布局中使用
    工具栏
    ,然后使用:

    override fun onCreate(savedInstanceState: Bundle?) {
      //..
      setContentView(R.layout.activity_countries)
      val toolbar = findViewById<Toolbar>(R.id.toolbar)
      setSupportActionBar(toolbar)
      //...
      setupActionBarWithNavController(navController, appBarConfiguration)
      //..
    }
    
    override-fun-onCreate(savedInstanceState:Bundle?){
    //..
    setContentView(R.layout.activity_国家/地区)
    val toolbar=findViewById(R.id.toolbar)
    设置支持操作栏(工具栏)
    //...
    setupActionBarWithNavController(navController、appBarConfiguration)
    //..
    }
    
    ANDROID JAVA

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

    选项2: 将操作栏添加到布局文件,如下所示:

    <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>
    

    享受

    您是否检查了logcat中的异常堆栈跟踪?我应该在异常堆栈跟踪中查找什么?主要是崩溃的原因。如果您不能真正解析它,那么应该将它附加到问题中,以便我们可以看到它。在本例中,崩溃似乎是导航助手调用的内部问题,因此我肯定很想知道它们实际上在哪里调用
    actionBar.setTitle
    。异常堆栈跟踪addedI我不知道。你能告诉我一个在线资源,在那里我可以了解动作栏和主题吗?官方文档已经过时了(参考Holo和其他东西),请查看这篇文章:谢谢,但我想我需要更多关于Android导航的基本信息,因为我只是在学习Android应用程序构建。啊,Jetpack导航是相当新的(这就是你似乎正在使用的),所以你可能想看看,因为我个人不使用它(我使用底层机制,因为我不需要图形编辑器)。不过,我希望文档能很好地描述它。
     Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);