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

相关推荐
老白干4 分钟前
基于 Spring AOP 的操作日志记录:以 DeptController 增删接口为例
java·python·spring
晚安code1 小时前
Java编程规范避坑指南:阿里开发手册15条强制规约实战解析
java·后端
2501_915106321 小时前
iOS 证书类型及作用说明 账号证书与签名配置的完整解读
android·ios·小程序·https·uni-app·iphone·webview
九皇叔叔1 小时前
RHEL9 安装 MySQL 8.4.11.LTS 版本
android·mysql·adb
海兰1 小时前
【数据库】tdsql(MySQL )的事务隔离级别
android·数据库·mysql
小蒜学长1 小时前
“守望自然”招募志愿者环保行动网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
哆啦A梦z2 小时前
Android BLE 实战:从小米手环 7 踩坑到完整连接框架
android
IKUN家族2 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·人工智能
萧瑟余晖2 小时前
Java深入解析篇十八之响应式编程
java·开发语言
笑一下蒜了.2 小时前
Linux 存储多路径访问手册|multipath.conf 各配置段详解
android·linux·运维