0

我需要将包括方法和字段的复杂对象传递给片段。复杂对象实现了一个接口IComplexObject,然后由片段调用,所以在我的片段中,复杂对象本身是不可见的。

为了创建片段的实例,我使用以下代码,受这篇文章的启发:

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();
    }

}

这通常像预期的那样工作,但是,在某些情况下,当我尝试complexObject从 Fragment访问时,onCreateView我得到一个 NullPointerException。

我只在一些旧设备和一些 Kindle 设备上遇到过这个异常。

任何想法我做错了什么?如何将对象传递到我的片段中?

4

2 回答 2

1

发生这种情况是因为您的片段可以完全重新创建(例如在方向更改期间),这就是为什么您拥有所有字段都等于 null 的片段的新对象。

如果您的对象包含其他对象,哪些类不受您的控制(例如库的类),将您的对象标记为 Parcelable 将无济于事

您应该查看setRetainInstance方法的一侧。我会帮你的。

于 2013-07-03T17:06:32.173 回答
1

1-使您的 IComplexObject Parcelable。
见那些例子123

2-但你在片段参数中的对象

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- onCreate() 函数获取你的对象形式参数

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle bundle = getArguments();
    this.complexObject = bundle.getParcelable("key_complexObject");
}
于 2013-07-03T08:43:20.327 回答