使用复杂对象进行片段初始化

时间:2013-07-03 08:23:08

标签: android android-fragments

我需要将包含方法和字段的复杂对象传递给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设备上遇到此例外。

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

2 个答案:

答案 0 :(得分:1)

1-使你的IComplexObject Parcelable 请参阅这些示例123

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方法的一面。它会有所帮助。