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 老项目迁移系列,持续更新中。

相关推荐
Java搬码工43 分钟前
CompletableFuture 完整详解 + 全场景使用案例
java
许心月1 小时前
Java学习资料网站汇总
java
c238561 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
帅次2 小时前
Kotlin 与 Java 互操作:混合工程里的平台类型与 API 边界
java·开发语言·kotlin·suspend·nullable
X-⃢_⃢-X2 小时前
一、第一阶段:认识 Spring Boot
java·spring boot·后端
前端工作日常2 小时前
我学习到的Java程序的生命周期
java·后端
SunnyDays10113 小时前
Java 实现 PDF 页面删除、排序、旋转和裁剪
java·pdf
人工干智能3 小时前
科普:Pandas 索引器 loc 与 iloc 的编程思维
java·人工智能·pandas
持力行4 小时前
C++与Java变量声明、定义及内存分配的核心区别
java·开发语言·c++
AFinalStone6 小时前
Android 7系统网络(八)应用API层—ConnectivityManager使用与实战调试
android·网络