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

相关推荐
金銀銅鐵5 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
文丑颜不良啊6 小时前
LeetCode1941~1960题目解析
java·leetcode
txxzjmzlh6 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj5208 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河669 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
SL_staff10 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
特立独行的猫A10 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
文丑颜不良啊11 小时前
LeetCode1961~1980题目解析
java·leetcode
文丑颜不良啊11 小时前
LeetCode2001~2020题目解析
java·leetcode
用户37215742613511 小时前
Java 批量提取 Word 文档中的图片并保存到本地
java