You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Navigation组件实现底部导航与Fragment的关联绑定

最简实现方案(基于你已经接入的Jetpack Navigation组件)

不需要手动编写Fragment切换、回退栈管理逻辑,仅需3步完成绑定:

步骤1:配置导航图 nav_graph.xml

在res/navigation/nav_graph.xml中添加三个Fragment作为导航目的地,必须保证每个目的地的id和后续菜单的id完全一致:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph"
    app:startDestination="@id/quoteFragment"> <!-- 这里配置默认显示的首个页面 -->

    <fragment
        android:id="@+id/quoteFragment"
        android:name="替换为你的包名.QuoteFragment"
        android:label="语录" />
    <fragment
        android:id="@+id/calendarFragment"
        android:name="替换为你的包名.CalendarFragment"
        android:label="日历" />
    <fragment
        android:id="@+id/addFragment"
        android:name="替换为你的包名.AddFragment"
        android:label="添加" />
</navigation>

步骤2:配置底部导航菜单 bottom_app_bar.xml

在res/menu/bottom_app_bar.xml中添加菜单项,菜单项id必须和导航图中对应Fragment的id完全相同:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/quoteFragment"
        android:icon="@drawable/ic_quote"
        android:title="语录" />
    <item
        android:id="@+id/calendarFragment"
        android:icon="@drawable/ic_calendar"
        android:title="日历" />
    <!-- AddFragment如果由FAB触发跳转,这里可以不用配置对应的菜单项 -->
</menu>

如果还没有对应的图标资源,可以先用系统自带的图标临时测试。

步骤3:MainActivity中完成绑定

首先给你布局里的FAB补加id属性android:id="@+id/fab",之后在原有代码基础上新增几行绑定逻辑即可:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.bottomNavigation.setBackground(null)

    // FAB点击跳转到AddFragment
    binding.fab.setOnClickListener {
        findNavController(R.id.nav_host_fragment).navigate(R.id.addFragment)
    }

    // 绑定底部导航和导航控制器,自动完成菜单点击跳转
    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController
    binding.bottomNavigation.setupWithNavController(navController)
}

额外说明

  • 这种实现方式由Navigation组件自动管理Fragment的生命周期、回退栈,不需要手动处理hide/show逻辑
  • 如果需要拦截菜单项点击事件,可以给binding.bottomNavigation设置setOnItemSelectedListener,自定义逻辑处理完成后返回true即可
  • 如果项目未引入Navigation UI依赖,需要在模块级build.gradle中添加对应依赖,版本和你项目的AndroidX版本匹配即可

内容的提问来源于stack exchange,提问作者Aydev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:09:02