Android 将对象传递到片段中
我最近处理了很多Android 将对象传递到片段中,android,fragment,android-bundle,Android,Fragment,Android Bundle,我最近处理了很多片段,并使用了两种不同的方法将对象传递给片段,但我能看到的唯一区别是,在下面FragmentOne所采用的方法中,您传递的对象必须实现可序列化的接口() 使用其中一个比另一个有什么好处吗 public class FragmentOne extends Fragment { public static final String FRAGMENT_BUNDLE_KEY = "com.example.FragmentOne.FRAGMENT_BUNDLE_K
片段
,并使用了两种不同的方法将对象传递给片段,但我能看到的唯一区别是,在下面FragmentOne所采用的方法中,您传递的对象必须实现可序列化的
接口()
使用其中一个比另一个有什么好处吗
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);
}
}
及
有3种方法可以将对象传递给片段 它们是:
setArguments
与Serializable
对象一起使用是最慢的方法(但我认为对于小对象也可以),并且您可以自动恢复状态Parcelable
传递是一种快速的方式(如果要传递元素集合,则首选第二种方式),并且可以自动恢复状态对于列表等集合: 我想分享我的经验 您需要实现Parcelable 只需使用putParcelableArrayList方法
ArrayList<LClass> localities = new ArrayList<LClass>;
...
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(KEY_LClass_LIST, localities);
fragmentInstance.setArguments(bundle);
return fragmentInstance;
因此,除非您出于其他原因需要自定义ArrayList,否则您可以避免做任何额外的工作,只为您的Location类实现Parcelable。可能的重复项也可以使用
Parcelable
,而不是Serlializable
,除非你真的需要Serializable
来实现一些非Android的特定目的Parcelable
显然要快得多。谢谢你的回答标记-我觉得你链接到的另一个答案与我在这里提出的问题相似,但有足够的不同,使这个问题更有用。然后也许可以编辑你的问题,使差异更明显。每个人都希望将数据传递到新创建的片段中。在回答我所链接的问题时,我展示了将数据传递到新创建的片段中的标准模式。如果您希望得到更多,则需要解释“more”是什么。AFAIK,在1)中,如果您在1)中使用setRetainInstance(true),则您确实已自动恢复状态。在1)中,setRetainInstance将按原样保存初始化的实例。当我们转到其他地方,操作系统关闭应用程序时,我们无法恢复数据。因此,在特定情况下,这可能是一种选择。
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);