【问题标题】:Passing objects in to Fragments将对象传递给片段
【发布时间】:2012-06-05 21:11:25
【问题描述】:

我最近一直在使用很多Fragments,并且一直在使用两种不同的方法将对象传递给片段,但我能看到的唯一区别是,在下面的 FragmentOne 采用的方法中,对象你传入的必须实现Serializable 接口(@98​​7654321@)。

使用其中一个有什么好处吗?

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

【问题讨论】:

  • 另外,使用Parcelable 而不是Serlializable,除非您真的需要Serializable 用于某些非Android 特定用途。 Parcelable 显然要快得多。
  • 感谢您回答 Mark - 我觉得您链接到的其他答案与我在这里提出的问题相似但又完全不同,以使这个问题仍然有用。
  • 然后也许编辑您的问题以使差异更加明显。你们每个人都想将数据传递到新创建的片段中。在我对链接到的问题的回答中,我展示了将数据传递到新创建的片段的标准模式。如果您期待更多,您需要解释“更多”是什么。

标签: android fragment android-bundle


【解决方案1】:

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

他们是:

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

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

【讨论】:

  • AFAIK,在 1) 中,如果您使用 setRetainInstance(true),您确实会自动恢复状态
  • in 1) setRetainInstance 将按原样保存初始化的实例。当我们去其他地方并且操作系统杀死应用程序时,我们无法恢复数据。所以它可能是特定情况下的选择。
【解决方案2】:

对于List等Collection:

我想分享我的经验。

你需要实现 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2015-11-07
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多