将自定义类传递给Fragment

时间:2014-01-13 14:34:55

标签: android fragment bundle

我有一个名为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的方法。

我尝试创建一个捆绑包,但我无法通过自定义类。我该怎么办?

5 个答案:

答案 0 :(得分:4)

数据需要实现Parcelable或Serializable。

然后,您可以使用bundle.putParcelable()或bundle.putSerializable()通过setArguments()方法将数据传递给两个片段。

答案 1 :(得分:4)

Bundles可以接受自定义类,如果它们实现ParcelableSerializableParcelable更快但实施起来更多,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策略那样的副本。