Fragment 手动跳转 → Navigation 组件

老写法(Java)

java 复制代码
// 跳转到详情页
DetailFragment detailFragment = new DetailFragment();
Bundle args = new Bundle();
args.putLong("itemId", itemId);
detailFragment.setArguments(args);

getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.fragment_container, detailFragment)
        .addToBackStack(null)
        .commit();

// 返回上一页
getSupportFragmentManager().popBackStack();

// 从详情页获取返回结果 --- 要手动传 targetFragment 或 EventBus

问题在哪里

Fragment 之间的跳转、传参、返回栈、返回结果全要手写。页面一多,几十个 beginTransaction 散布在代码各处,维护起来极乱,返回栈深度一高容易出 bug。

新写法(Navigation 组件)

添加依赖:

groovy 复制代码
implementation "androidx.navigation:navigation-fragment-ktx:2.7.7"
implementation "androidx.navigation:navigation-ui-ktx:2.7.7"

导航图 res/navigation/nav_graph.xml

xml 复制代码
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:startDestination="@id/listFragment">

    <fragment
        android:id="@+id/listFragment"
        android:name="com.example.ListFragment">
        <action
            android:id="@+id/action_list_to_detail"
            app:destination="@id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.DetailFragment">
        <argument android:name="itemId" app:argType="long" />
    </fragment>
</navigation>

Activity 布局里放 NavHostFragment

xml 复制代码
<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/nav_graph"
    app:defaultNavHost="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Kotlin 中跳转:

kotlin 复制代码
// 跳转(带参数)
val bundle = Bundle().apply {
    putLong("itemId", itemId)
}
findNavController().navigate(R.id.action_list_to_detail, bundle)

// 返回
findNavController().navigateUp()

一句话注意

app:defaultNavHost="true" 别忘了加,否则系统返回键不会自动处理 Navigation 的返回栈,按了没反应。另外 Navigation 默认不支持 Fragment 间直接回传结果,可以通过共享 ViewModel 或者 savedStateHandle 绕过去。

如果 Action 里的 app:argType 写错或者 Safe Args 插件没配,编译不会报错,运行时直接崩,这个比手动传 Bundle 更容易排查问题------要么 IDEA 标红,要么编译不过,不会留到线上。


Java Android 老项目迁移系列,持续更新中。

相关推荐
吴声子夜歌2 小时前
Java面试——Spark原理及应用(一)
java·面试·spark
慧一居士3 小时前
ThreadLocal 功能及使用场景介绍,使用详解
java
zh73143 小时前
typephp的编译核心phpx原理解析
android·java·开发语言
2401_894915535 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
Java牛马9 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌9 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
东小西10 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
胖大师10 小时前
Android Audio-FW
android
mqiqe11 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
脉动数据行情11 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股