Android底部导航切换仅显示起始目的地Fragment其余不显示如何解决
问题根因及解决方案
1. 核心问题:NavController未成功绑定
你当前用findNavController(R.id.nav_host_fragment)的方式在Activity onCreate阶段获取导航控制器,大概率返回null,后续setupWithNavController因为你用了?.apply空安全调用直接被跳过,底部导航和导航图完全没有建立绑定,所以切换标签没有任何效果,只会保留初始的start destination页面。
2. 次要问题:NavHostFragment约束冲突
你在布局中给NavHostFragment同时设置了两个底部方向约束:
<!-- 重复约束,产生冲突 --> app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toTopOf="@id/bottomNavigationView"
ConstraintLayout无法识别冲突的同方向约束,会导致NavHostFragment显示范围异常,即使导航生效也可能出现页面被底部导航遮挡的问题。
修复步骤
- 替换获取NavController的代码,修改MainActivity的initUI方法:
private fun initUI() { bottomNavigationView.itemIconTintList = null // 改为从FragmentManager获取NavHostFragment,再拿NavController,保证能拿到实例 val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController bottomNavigationView.setupWithNavController(navController) }
- 修改activity_main布局中NavHostFragment的约束,删掉多余的bottom约束:
<fragment android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="0dp" android:layout_height="0dp" app:defaultNavHost="true" <!-- 删掉这行冲突的约束 app:layout_constraintBottom_toBottomOf="parent" --> app:layout_constraintBottom_toTopOf="@id/bottomNavigationView" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/layout_toolbar" app:navGraph="@navigation/main_navigation" />
可选优化
建议把布局中<fragment>标签替换为androidx.fragment.app.FragmentContainerView,这是Google官方推荐的承载NavHostFragment的容器,能避免很多初始化阶段的异常问题。
内容的提问来源于stack exchange,提问作者Kiran
相关产品推荐
相关产品推荐

