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