启动Android应用时NavController未设置致RuntimeException错误求助
问题描述
启动Android应用时触发如下错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.roomapp/com.example.roomapp.MainActivity}: java.lang.IllegalStateException: Activity com.example.roomapp.MainActivity@1a747ad does not have a NavController set on 2131230894
相关代码如下:
MainActivity.kt
package com.example.roomapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.navigation.findNavController import androidx.navigation.ui.setupActionBarWithNavController class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setupActionBarWithNavController(findNavController(R.id.fragmentContainerView)) } override fun onSupportNavigateUp(): Boolean { val navController = findNavController(R.id.fragmentContainerView) return navController.navigateUp() || super.onSupportNavigateUp() } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent"> <androidx.fragment.app.FragmentContainerView android:id="@+id/fragmentContainerView" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:navGraph="@navigation/my_nav" /> </androidx.constraintlayout.widget.ConstraintLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.RoomApp" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true" android:label="@string/app_name" android:theme="@style/Theme.AppCompat"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
解决方案
这个错误的核心原因是:使用FragmentContainerView承载NavHostFragment时,在Activity的onCreate阶段直接调用findNavController()会失败——此时NavHostFragment还未完成依附,系统找不到对应的NavController。
修改MainActivity.kt代码,通过supportFragmentManager获取NavHostFragment实例,再从中获取NavController:
package com.example.roomapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupActionBarWithNavController class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 替换原有的findNavController调用 val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment val navController = navHostFragment.navController setupActionBarWithNavController(navController) } override fun onSupportNavigateUp(): Boolean { val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment val navController = navHostFragment.navController return navController.navigateUp() || super.onSupportNavigateUp() } }
另外需要确认:
@navigation/my_nav导航图文件存在,且已正确配置起始目的地(app:startDestination)- 依赖库中已引入Navigation相关组件(如
androidx.navigation:navigation-fragment-ktx、androidx.navigation:navigation-ui-ktx)
内容的提问来源于stack exchange,提问作者miq
相关产品推荐
相关产品推荐

