将对象传递给Fragments

40

我最近一直在使用大量的Fragments,并且一直在使用两种不同的方法来向Fragments传递对象,但我只看到了 FragmentOne 中采用的方法与另一个方法的区别在于你必须实现 Serializable 接口(以及所有相关内容)。

这两种方法有没有优劣之分呢?

public class FragmentOne extends Fragment {
    public static final String FRAGMENT_BUNDLE_KEY = 
        "com.example.FragmentOne.FRAGMENT_BUNDLE_KEY";

    public static FragmentOne newInstance(SomeObject someObject) {
        FragmentOne f = new FragmentOne();
        Bundle args = new Bundle();
        args.putSerializable(FRAGMENT_BUNDLE_KEY, someObject);
        f.setArguments(args);
        return f;
    }

    public SomeObject getSomeObject() {
        return (SomeObject) getArguments().getSerializable(FRAGMENT_BUNDLE_KEY);
    }
}

public class FragmentTwo extends Fragment {
    SomeObject mSomeObject;  

    public static FragmentTwo newInstance(SomeObject someObject) {
        FragmentTwo fragment = new FragmentTwo();
        fragment.setSomeObject(someObject);
        return fragment;
    }

    public void setSomeObject(SomeObject someObject) {
        mSomeObject = someObject;
    }
}

1
可能是为片段提供初始数据的正确方法的重复问题。 - CommonsWare
1
此外,除非您确实需要Serializable来完成某些非Android特定的目的,否则请使用Parcelable而不是Serializable。显然,Parcelable更快。 - CommonsWare
谢谢你回答,马克 - 我觉得你链接的另一个答案与我在这里提出的问题有足够不同的地方,使得这个问题仍然是有用的。 - Martyn
然后,也许您可以编辑您的问题以使差异更加明显。您每个人都想将数据传递到新创建的片段中。在我回答我链接到的问题时,我展示了将数据传递到新创建的片段的标准模式。如果您期望有更多内容,您需要解释一下这个“更多”的是什么。 - CommonsWare
2个回答

57

有三种方式可以将对象传递给一个Fragment:

它们是:

  1. 通过setter方法传递对象是最快的方式,但状态不会自动恢复。
  2. setArguments和使用Serializable对象的方式是最慢的(但对于小对象来说还可以),你可以自动恢复状态。
  3. 作为Parcelable传递是一种快速的方式(如果你有一组元素需要传递,建议优先选择它),且你可以自动恢复状态。

http://developer.android.com/reference/android/os/Parcelable.html


据我所知,在1)中,如果您使用setRetainInstance(true),则会自动恢复状态。 - Jose_GD
3
  1. setRetainInstance会保存已初始化的实例。当我们去其他地方并且操作系统关闭了应用程序,我们无法恢复数据。因此,在特定情况下,这可能是一个选项。
- logcat

2

对于像List这样的集合:

我想分享我的经验。

你需要实现Parcelable。

只需使用putParcelableArrayList方法即可。

ArrayList<LClass> localities = new ArrayList<LClass>;
...
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(KEY_LClass_LIST, localities);
fragmentInstance.setArguments(bundle);

return fragmentInstance;

并使用以下方法检索...

localities = savedInstanceState.getParcelableArrayList(KEY_LCLass_LIST);

所以,除非您需要自定义ArrayList以实现某些其他功能,否则可以避免执行任何额外的工作,并仅为您的Locality类实现Parcelable。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接