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

时间:2019-11-14 16:08:02

标签: android-studio kotlin

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

进程:com.riverstonetech.gositeuk,PID:27370     java.lang.RuntimeException:无法启动活动ComponentInfo {com.riverstonetech.gositeuk / com.riverstonetech.gositeuk.CountriesActivity}:java.lang.NullPointerException:尝试调用虚拟方法'void androidx.appcompat.app.ActionBar.setTitle( java.lang.CharSequence)'上的空对象引用         在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)         在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)         在android.app.ActivityThread.-wrap12(ActivityThread.java)         在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1477)         在android.os.Handler.dispatchMessage(Handler.java:102)         在android.os.Looper.loop(Looper.java:154)         在android.app.ActivityThread.main(ActivityThread.java:6119)         在java.lang.reflect.Method.invoke(本机方法)         在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)         在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)      原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)'         在androidx.navigation.ui.ActionBarOnDestinationChangedListener.setTitle(ActionBarOnDestinationChangedListener.java:48)         在androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.onDestinationChanged(AbstractAppBarOnDestinationChangedListener.java:100)         在androidx.navigation.NavController.addOnDestinationChangedListener(NavController.java:218)         在androidx.navigation.ui.NavigationUI.setupActionBarWithNavController(NavigationUI.java:220)         在androidx.navigation.ui.ActivityKt.setupActionBarWithNavController(Activity.kt:74)         在com.riverstonetech.gositeuk.CountriesActivity.onCreate(CountriesActivity.kt:31)         在android.app.Activity.performCreate(Activity.java:6679)         在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)         在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)         在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)         在android.app.ActivityThread.-wrap12(ActivityThread.java)         在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1477)         在android.os.Handler.dispatchMessage(Handler.java:102)         在android.os.Looper.loop(Looper.java:154)         在android.app.ActivityThread.main(ActivityThread.java:6119)         在java.lang.reflect.Method.invoke(本机方法)         在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)         在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)

5 个答案:

答案 0 :(得分:2)

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

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

  2. 清理构建(Build-> Clean Project)

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

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

  5. 重新启动后,再次构建并运行该应用程序。

答案 1 :(得分:2)

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

setupActionBarWithNavController(navController, appBarConfiguration)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

听起来像您为自己的“活动”设置了一个主题,该主题具有.NoActionBar

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

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

答案 4 :(得分:0)

ANDROID JAVA

选项1: 在清单上更改Activity 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>

在setContentView()之后的Activity上添加以下内容:

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

享受