我有一个名为Data的自定义类,它包含所有数据。主要活动创建了两个片段。我在主要活动中有一个字段:
private Data data = new Data();
使用此方法创建片段:
private ArrayList<Fragment> getFragments() {
ArrayList<Fragment> fragments = new ArrayList<Fragment>();
fragments.add(new fragment_one());
fragments.add(new fragment_two());
return fragments;
}
我需要将数据字段传递给片段,因此片段可以访问Data的方法。
我尝试创建一个捆绑包,但我无法通过自定义类。我该怎么办?
答案 0 :(得分:4)
数据需要实现Parcelable或Serializable。
然后,您可以使用bundle.putParcelable()或bundle.putSerializable()通过setArguments()方法将数据传递给两个片段。
答案 1 :(得分:4)
Bundles可以接受自定义类,如果它们实现Parcelable
或Serializable
,Parcelable
更快但实施起来更多,Serializable
更容易实现,但速度更慢。
然后你可以这样做:
Bundle bundle = new Bundle();
bundle.putSerializable("MyData", data);
fragment_one.setArguments(bundle);
现在fragment_one
可以使用data
方法访问onCreate(Bundle bundleHoldingData)
。
另一个选择是让片段中有一个公共setter来获取数据。这样做的好处是您不必等到数据准备好添加片段。
答案 2 :(得分:1)
您不应该传递对片段的引用,所有数据都应该使用setArguments
传递(除非您的片段被保留)。原因是android可能会在配置更改期间破坏您的片段,并在创建活动期间重新创建它。
所以你应该在setArguments中传递数据,或者使用singleton类来访问它,即。申请类。
[edit] - 我自己没试过这个,但你可以找到在线工具让你的数据类可以分配,这里有一个:http://devk.it/proj/parcelabler/
答案 3 :(得分:0)
您可以根据保留的数据设置静态对象,并注意内存泄漏。这样你就可以在碎片中达到它。但是,使数据可分割并将其与包一起传递总是更好的选择。
答案 4 :(得分:0)
一种选择是为Activity类提供数据访问器。然后,在您的片段中,调用getActivity(),将其强制转换为派生类型,并根据需要获取数据。
这当然会创建从您的片段到活动的依赖关系,但是如果它不是一个通用的,可重用的片段,那么实现起来非常简单明了,这意味着您可以获得对当前片段的引用活动数据而不是像Bundle / Parcelable / Serializable策略那样的副本。