Android Fragment间传递Parcelable数据时触发空指针异常求助
问题排查与解决方案
嘿,这个空指针问题的根源其实一眼就能看出来——你创建了两个完全独立的DetailProgressFragment实例,却只给其中一个设置了参数!
错误原因拆解
你看这段代码:
// 第一个实例:设置了Bundle参数,但没用来显示 new DetailProgressFragment().setArguments(bundle); // 第二个实例:全新的、没有任何参数的实例,才是实际显示的那个 fragmentTransaction.replace(R.id.fragment, new DetailProgressFragment()).commit();
你给第一个Fragment实例配置了参数,但实际用来替换显示的却是第二个全新的实例,这个新实例的getArguments()自然是null,调用getParcelable()的时候就触发了空指针异常。
修正后的代码
只需要创建一次Fragment实例,复用它就行,同时注意addToBackStack()要在commit()之前调用(不然返回栈不会生效):
Bundle bundle = new Bundle(); progress = DetailProgressFragmentArgs.fromBundle(getArguments()).getProgress(); bundle.putParcelable("progress", progress); // 只创建一次Fragment实例,给它设置参数 DetailProgressFragment targetFragment = new DetailProgressFragment(); targetFragment.setArguments(bundle); Log.d("testProgress", String.valueOf(progress.getProgress_id())); // 使用刚才设置好参数的实例进行替换 fragmentTransaction.replace(R.id.fragment, targetFragment); fragmentTransaction.addToBackStack(null); // 先添加到返回栈再提交事务 fragmentTransaction.commit();
额外注意事项
如果你的Progress是自定义类,一定要确保它正确实现了Parcelable接口:
- 必须重写
writeToParcel()方法,把所有需要传递的字段写入Parcel - 必须定义
public static final Parcelable.Creator<Progress> CREATOR静态常量,实现createFromParcel()和newArray()方法 - 所有嵌套的自定义类也需要实现Parcelable(如果用Serializable也可以,但Parcelable效率更高)
这样修改后,第二个Fragment里的getArguments()就能拿到正确的Bundle,空指针问题就解决啦!
内容的提问来源于stack exchange,提问作者Michelle Alexandra
相关产品推荐
相关产品推荐

