使用FragmentContainerView搭配Navigation Component实现底部导航时Fragment无法跳转
问题原因及修复方案
1. 底部导航菜单ID与导航图目的地ID不匹配
Navigation组件绑定BottomNavigationView的核心规则是菜单项ID必须与导航图中对应目的地的ID完全一致,你当前配置两边ID不匹配,导致底部导航点击无响应:
- menu.xml中三个菜单项ID为
feed_fragment、messages_fragment、profile_fragment - nav_graph_main中三个首页目的地ID为
fragmentLibrary、fragmentTransaction、fragmentAccount
修复方案:修改menu.xml的item ID与导航图保持一致:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/fragmentLibrary" android:icon="@drawable/ic_library" android:title="@string/library" /> <item android:id="@+id/fragmentTransaction" android:icon="@drawable/ic_assignment" android:title="@string/transactions" /> <item android:id="@+id/fragmentAccount" android:icon="@drawable/ic_account" android:title="@string/account" /> </menu>
2. MainActivity中navHostFragment变量被局部遮蔽
你在类中声明了全局的navHostFragment变量,但在onCreate方法中用val navHostFragment重新定义了局部变量,导致全局变量未被初始化,后续在onOptionsItemSelected中调用时会触发未初始化异常。
修复方案:删除onCreate中navHostFragment前的val关键字,直接给全局变量赋值:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // 移除val,直接给全局变量赋值 navHostFragment = supportFragmentManager.findFragmentById(R.id.main_nav_host_fragment) as NavHostFragment navController = navHostFragment.navController binding.bottomNavigationView.setupWithNavController(navController) }
3. 子页面跳转无响应的检查
如果是在Account页点击按钮跳转到修改签名、安全设置等子页面无响应,检查FragmentAccount中的跳转逻辑是否正确调用导航控制器,示例如下:
// 在FragmentAccount的对应点击事件中调用 view.findViewById<Button>(R.id.btn_change_signature).setOnClickListener { findNavController().navigate(R.id.action_fragmentAccount_to_changeSignatureFragment) }
内容的提问来源于stack exchange,提问作者Burak Karaduman
相关产品推荐
相关产品推荐

