【问题标题】:How do I fix MainActivity does not have a navcontroller?如何修复 MainActivity 没有导航控制器?
【发布时间】:2020-03-20 06:30:39
【问题描述】:

我刚刚编译了我的代码,当我尝试启动应用程序时收到错误消息。我目前正在尝试为我的班级项目设置 RecycleView。我的目标是让 RecycleView 显示内容有点像 reddit 移动应用程序。我以为我的名为“scrollview1”的 RecycleView 有一个导航控制器设置。不知道为什么我会得到这个输出

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.john.chanapi/com.john.chanapi.MainActivity}: java.lang.IllegalStateException: Activity com.john.chanapi.MainActivity@1850938 does not have a NavController set on 2131230866

我的 MainActivity.kt:

package com.john.chanapi

import android.os.Bundle
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.snackbar.Snackbar
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import androidx.drawerlayout.widget.DrawerLayout
import com.google.android.material.navigation.NavigationView
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import android.view.Menu
import android.view.View

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)

        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()
        }
        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        val navView: NavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.scrollview1)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.nav_home, R.id.nav_new, R.id.nav_rising,
                R.id.nav_top, R.id.nav_inbox, R.id.nav_message
            ), drawerLayout
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }


    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.main, menu)
        return true
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = findNavController(R.id.scrollview1)
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }
}

我的activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>

【问题讨论】:

  • 您已包含指向您的 content_main xml 的链接,但您的代码正在膨胀 activity_main - 该 XML 是什么样的?
  • 我编辑了帖子并包含了activity_main.xml
  • 需要在activity_main中定义fragment。 stackoverflow.com/questions/50502269/…
  • @JohnJoe 我尝试关注该线程并想出了这个片段。 。我将它插入activity_main。应用程序仍然崩溃。我不认为我这样做是正确的。
  • 同样的错误????

标签: android kotlin


【解决方案1】:

使用简单的&lt;fragment&gt; 标签代替 &lt;com.google.android.material.navigation.NavigationView&gt;

【讨论】:

    【解决方案2】:

    为了更安全,(在 Activity 内)避免使用 findNavController(Int) 来初始化 NavController,而是从 NavHostFragment 初始化它,如图所示

    val navHostFragment =
                supportFragmentManager.findFragmentById(R.id.navigation_host) as NavHostFragment
    val navController: NavController = navHostFragment.navController
    

    【讨论】:

    【解决方案3】:

    内部 onCreate 视图还没有膨胀。当你调用 findNavController 时它会失败。

    一种解决方案是重写 onViewCreated 方法并将 setSupportActionBar 之后的代码移动到 onViewCreated 中。

    样本

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val fab: FloatingActionButton = findViewById(R.id.fab)
        fab.setOnClickListener {}
    
        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        val navView: NavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.scrollview1)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.nav_home, R.id.nav_new, R.id.nav_rising,
                R.id.nav_top, R.id.nav_inbox, R.id.nav_message
            ), drawerLayout
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }
    

    【讨论】:

      【解决方案4】:

      val navController = findNavController(R.id.scrollview1)

      因为R.id.scrollview1会找到RecyclerView这个UI组件,

      不是NavController

      【讨论】:

      • 我将如何解决这个问题?我是否将括号中的 ID 替换为导航控制器?
      • @johnkasarda 删除各种NavController,搜索RecyclerView的使用方法
      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 2012-08-30
      • 1970-01-01
      • 2013-02-03
      • 2017-05-14
      • 1970-01-01
      相关资源
      最近更新 更多