我需要将包含方法和字段的复杂对象传递给Fragment。复杂对象实现了一个接口IComplexObject
,然后由Fragment调用,因此在我的Fragment中,复杂对象本身是不可见的。
为了创建片段的实例,我使用以下代码,灵感来自this post:
public class SimpleContentFragment extends Fragment {
private IComplexObject complexObject;
protected static SimpleContentFragment newInstance(IComplexObject complexObject) {
SimpleContentFragment f = new SimpleContentFragment();
f.complexObject = complexObject;
return f;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
complexObject.doSomeThings();
}
}
这通常与预期的一样,但是,在某些情况下,当我尝试从Fragment的complexObject
访问onCreateView
时,我得到一个NullPointerException。
我只在一些旧设备和一些Kindle设备上遇到此例外。
任何想法我做错了什么?我如何将对象传递给我的片段?
答案 0 :(得分:1)
1-使你的IComplexObject Parcelable 请参阅这些示例1,2和3
2-但你的对象是片段args
protected static SimpleContentFragment newInstance(IComplexObject complexObject) {
SimpleContentFragment f = new SimpleContentFragment();
Bundle args = new Bundle();
args.putParcelable("key_complexObject", complexObject);
f.setArguments(args);
return f;
}
3- on onCreate()函数获取你的对象形式args
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
this.complexObject = bundle.getParcelable("key_complexObject");
}
答案 1 :(得分:1)
这是因为您的片段可以完全重新创建(例如在方向更改期间),这就是为什么你有片段的新对象,所有字段都等于null。
如果对象包含其他对象,哪些类不在您的控制之下(例如库的类),则将对象标记为Parcelable无效
您应该查看setRetainInstance方法的一面。它会有所帮助。