使用Navigation Component时应用崩溃,FragmentContainerView无法加载
问题概述
使用Navigation Component时应用启动崩溃,无法正确加载FragmentContainerView,替换为<fragment>标签后问题仍存在。错误日志核心为java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context androidx.fragment.app.FragmentHostCallback.getContext()' on a null object reference。
解决方案
1. 调整MainActivity中视图初始化顺序
错误根源在于视图绑定初始化早于Activity的核心初始化流程,导致FragmentContainerView无法获取有效的上下文环境。需将super.onCreate(savedInstanceState)移至binding.inflate之前:
修改后的MainActivity代码:
package com.example.task2 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController import com.example.task2.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 优先完成Activity初始化 binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.bottomNavMain.menu.findItem(R.id.fragmentHome).isChecked = true val navHost = supportFragmentManager.findFragmentById(R.id.main_nav_host) as NavHostFragment val navController = navHost.navController binding.bottomNavMain.setupWithNavController(navController) } }
2. 验证核心配置一致性
- 确认
bottom_nav.xml中的菜单项ID与main_nav.xml导航图中的Fragment ID完全匹配(当前代码中fragmentHome、fragmentRegister、fragmentProfile已匹配) - 检查所有Fragment类是否正确继承自
androidx.fragment.app.Fragment,例如:
class FragmentHome : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.home_fragment, container, false) } }
原因说明
在原代码中,先初始化View Binding再调用super.onCreate,此时Activity的FragmentManager尚未完成初始化,FragmentContainerView无法获取有效的FragmentHostCallback上下文,进而触发空指针异常。调整初始化顺序后,Activity完成核心初始化流程,FragmentManager可正常为NavHostFragment提供上下文支持。
内容的提问来源于stack exchange,提问作者mahi
相关产品推荐
相关产品推荐

