40

我最近一直在使用很多方法,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;
    }
}
4

2 回答 2

55

将对象传递给片段有 3 种方法

他们是:

  1. 通过 setter 传递对象是最快的方法,但不会自动恢复状态。
  2. setArguments使用Serializable对象是最慢的方式(但我认为对于小对象来说还可以),并且您可以自动恢复状态。
  3. 传递 asParcelable是一种快速的方式(如果您有要传递的元素集合,则更喜欢它而不是第二个),并且您可以自动恢复状态。

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

于 2012-05-31T15:40:06.203 回答
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。

于 2015-08-08T09:18:18.180 回答