最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Fragment 手动跳转 - Navigation 组件
时间:2026-06-04 09:05:53 编辑:袖梨 来源:一聚教程网
Fragment 手动跳转 → Navigation 组件
老写法(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 组件)
添加依赖:
implementation "androidx.navigation:navigation-fragment-ktx:2.7.7"
implementation "androidx.navigation:navigation-ui-ktx:2.7.7"
导航图 res/navigation/nav_graph.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:
<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 中跳转:
// 跳转(带参数)
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 老项目迁移系列,持续更新中。
相关文章
- 实测Gemini 3.0使用教程:5个常见避坑与全流程实操 06-04
- Gemini下载怎么用?3个步骤搞定 06-04
- Gemini API密钥怎么申请?2026实测4种渠道对比 06-04
- 壹深圳app如何查看回放 06-04
- 我亲测了Gemini学生认证,全流程+踩坑记录 06-04
- Gemini 3.0使用教程 vs 4.0:3大区别与选择建议 06-04