Activity 间传值 → Navigation 参数

老写法(Java)

java 复制代码
// 发送方
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("itemId", 123L);
intent.putExtra("title", "商品详情");
startActivity(intent);

// 接收方
long itemId = getIntent().getLongExtra("itemId", 0);
String title = getIntent().getStringExtra("title");

问题在哪里

Key 是字符串常量,拼写错误编译期不检查。类型要记清楚------忘了 getLongExtra 用了 getIntExtra,数据就丢了。页面间传参关系散落在各处,没有结构化的定义。

新写法(Navigation + Safe Args)

导航图定义:

xml 复制代码
<fragment android:id="@+id/detailFragment"
    android:name="com.example.DetailFragment">
    <argument android:name="itemId" app:argType="long" />
    <argument android:name="title" app:argType="string" />
</fragment>

Safe Args 自动生成 DetailFragmentArgs 类。发送方:

kotlin 复制代码
val args = Bundle().apply {
    putLong("itemId", 123L)
    putString("title", "商品详情")
}
findNavController().navigate(R.id.detailFragment, args)

接收方:

kotlin 复制代码
val args: DetailFragmentArgs by navArgs()
val itemId = args.itemId
val title = args.title

一句话注意

Safe Args 插件在编译期生成类型安全的参数访问类,Key 和类型都对不上就编译报错。但需要额外配置 Gradle 插件。如果不想加 Safe Args,手动传 Bundle 也比 putExtra 好------至少数据定义在一起,不会散落。

导航参数不适合传大对象(如 List 包含几百个元素),因为要序列化到 saved state。大对象通过共享 ViewModel 或缓存层传递更合理。


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

相关推荐
用户41659673693551 小时前
Android WebView 加载 file:// 离线页面调试教程
android·前端
plainGeekDev1 小时前
onActivityResult → ActivityResult API
android·java·kotlin
Sunia1 小时前
《AgentX 专栏》10-生产部署:3台2C4G云服务器把企业级Agent真正跑起来的完整方案
java·架构
ZhengEnCi2 小时前
J7A-高级Java工程师面试三道灵魂拷问-深度广度与工程素养的终极检验
java·后端
随遇丿而安5 小时前
第10周:Activity 基础功能与生命周期优化
android
alexhilton18 小时前
Android车载OS中的Remote Compose
android·kotlin·android jetpack
狼爷20 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
祎雪双十Gy1 天前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
小锋java12341 天前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java