【问题标题】:Fragment initialization with complex object复杂对象的片段初始化
【发布时间】:2013-07-03 08:23:07
【问题描述】:

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

为了创建片段的实例,我使用以下代码,灵感来自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 的 onCreateView 访问 complexObject 时,我得到一个 NullPointerException。

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

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

【问题讨论】:

  • 使接口IComplexObject扩展Parcelable

标签: android android-fragments


【解决方案1】:

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

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

您应该查看setRetainInstance 方法的一侧。会有帮助的。

【讨论】:

  • 谢谢,潜水员。在我的清单中,我有 。这不等同于 setRetainInstance 吗?关于 Parcelable 我还没有开始工作......
  • 不一样,如果你说你的复杂对象有时会变成空。你试过 setRetainInstance 吗?在保存片段对象的情况下肯定会有所帮助。
  • 我已从清单中删除了方向更改,并将 setRetainInstance 添加到片段的构造函数中。在我的测试设备上,这有效。但是,到目前为止我无法重现 NullPointerException,所以我会在第一次用户升级后知道它是否有效,并且我没有通过 ACRA 收到异常报告,我会告诉你的。
  • 不幸的是,这没有帮助。我得到了和更新前一样的 NPE,真的很困惑......
  • 请在获得 NPE 后给我更多信息?在哪些情况下?
【解决方案2】:

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

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

    Bundle bundle = getArguments();
    this.complexObject = bundle.getParcelable("key_complexObject");
}

【讨论】:

  • 感谢您的提示,我稍后会尝试!无论如何,我不明白为什么我上面的方法在大多数情况下都有效,只是有时会失败......
  • 如果您的复杂对象包含不可打包的项目,如侦听器,该怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多