如何正确使用NavController?运行时提示Activity未设置NavController报错如何解决
报错核心原因:你在Activity的
onCreate阶段调用Navigation.findNavController()获取FragmentContainerView对应的NavController时,作为导航宿主的NavHostFragment还没有完成初始化,无法返回绑定的NavController,也有可能是你的布局中导航宿主的配置存在遗漏。
解决方案
- 方案1:通过NavHostFragment直接获取NavController(推荐,适配所有Navigation版本)
把onCreate中获取NavController的代码替换为如下写法,onSupportNavigateUp中的获取逻辑也可以同步替换,避免偶现空指针:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 先通过FragmentManager获取NavHostFragment实例 NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); NavController controller = navHostFragment.getNavController(); NavigationUI.setupActionBarWithNavController(this,controller); } @Override public boolean onSupportNavigateUp() { NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); NavController controller = navHostFragment.getNavController(); return controller.navigateUp(); }
- 方案2:检查导航宿主布局配置
打开activity_main.xml布局文件,确认FragmentContainerView节点包含以下必填属性:
<androidx.fragment.app.FragmentContainerView android:id="@+id/fragmentContainerView" android:name="androidx.navigation.fragment.NavHostFragment" app:navGraph="@navigation/你的导航图文件名" app:defaultNavHost="true" <!-- 其他自定义属性 --> />
如果漏写android:name或app:navGraph属性,NavHostFragment不会自动初始化NavController,就会触发该报错。
- 方案3:延迟获取NavController(适配特殊场景)
如果前两个方案都不生效,可以把获取NavController的逻辑延迟到布局绘制完成后执行:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 等根布局绘制完成后再获取NavController findViewById(android.R.id.content).post(() -> { NavController controller=Navigation.findNavController(this,R.id.fragmentContainerView); NavigationUI.setupActionBarWithNavController(this,controller); }); }
内容的提问来源于stack exchange,提问作者user14936801
相关产品推荐
相关产品推荐

