如何在Fragment中正确获取Parcelable对象?解决API兼容报错问题
解决Fragment中获取Parcelable对象的废弃方法问题
错误原因
你碰到的NoSuchMethodError是因为Bundle.getParcelable(String, Class<T>)是**Android 13(API 33)**才新增的方法,当App运行在低于API 33的系统上时,系统自带的Bundle类没有这个方法,因此触发报错。
最优方案:使用Navigation Safe Args
既然你已经引入了Navigation Safe Args插件,这是官方推荐的类型安全参数传递方案,能彻底规避手动处理Bundle和废弃方法的问题,步骤如下:
补全Safe Args插件配置
除了项目级build.gradle中的classpath,还要在模块级build.gradle中应用插件:plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-parcelize' id 'androidx.navigation.safeargs.kotlin' // 新增这一行 }在导航图中定义参数
在nav_graph.xml里给目标Fragment添加参数,指定类型为你的Jar类(需填写完整包名):<fragment android:id="@+id/target_fragment" android:name="com.your.package.TargetFragment"> <argument android:name="jar" app:argType="com.your.package.Jar" /> </fragment>在Fragment中安全获取参数
编译后,Safe Args会自动生成对应Fragment的Args类(比如TargetFragmentArgs),直接用它获取参数,无需强转,完全类型安全:override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val args = TargetFragmentArgs.fromBundle(requireArguments()) viewModel.setJar(args.jar) setObservers() }
兼容低版本的替代方案(不推荐,优先级低于Safe Args)
如果暂时不想切换到Safe Args,可以用AndroidX提供的兼容扩展方法,前提是确保依赖了androidx.core:core-ktx:
添加core-ktx依赖(若未添加)
dependencies { implementation "androidx.core:core-ktx:1.12.0" // 使用最新稳定版本 }用扩展方法获取Parcelable
// 更安全的写法,避免强转空指针 arguments?.getParcelable<Jar>("jar")?.let { jar -> viewModel.setJar(jar) }这个扩展方法会在低版本系统上做兼容处理,不会触发NoSuchMethodError。
其他注意事项
- 若执意使用
getParcelable(String, Class<T>),可以将App的minSdkVersion设为33,但这会丢失大量低版本用户,不建议这么做。 - 保持
kotlin-parcelize插件版本更新,确保Parcelable实体类的实现无问题。
内容的提问来源于stack exchange,提问作者Abhijeet Ohol
相关产品推荐
相关产品推荐

