将自定义类传递给Fragment

5

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

我尝试创建一个Bundle来传递数据,但是我无法传递自定义类。我该怎么办?


2
数据类实现Parcelable接口吗? - Raghunandan
这并不行。我会研究一下。还有其他方法吗? - stefana
这是一个关于如何使用意图在Android活动之间发送对象的问题。或许这可以帮到你。 - Raghunandan
5个回答

6

Bundles可以接受自定义类,如果它们实现了ParcelableSerializable,其中Parcelable更快,但需要更多的工作来实现,Serializable更容易实现,但速度较慢。

然后你可以这样做:

Bundle bundle = new Bundle();
bundle.putSerializable("MyData", data);
fragment_one.setArguments(bundle);

现在,在fragment_oneonCreate(Bundle bundleHoldingData)方法中,可以访问data了。

另一种选择是在您的片段中拥有一个公共的setter方法,该方法接收数据。这样做的好处是您不必等待数据准备好才能添加片段。


4

数据需要实现Parcelable或Serializable接口。

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


1

你不应该传递片段的引用,所有数据都应使用 setArguments 传递(除非你的片段已保留)。原因是在配置更改期间,Android 可能会销毁您的片段,并在活动创建期间重新创建它。

因此,您应该将数据传递给 setArguments,或者使用单例类(即应用程序类)来访问它。

[编辑] - 我没有尝试过这个,但您可以找到在线工具使您的数据类可包装化,这里是一个链接:http://devk.it/proj/parcelabler/


0

你可以根据你所保留的数据量设置一个静态对象,并小心处理内存泄漏。这样,你就可以在片段中访问它。但是,将数据打包并通过Bundle传递始终是更好的选择。


0

一种选择是在Activity类上提供一个访问器(accessor)来获取数据。然后,在你的Fragment中,你可以调用getActivity()方法,将其转换为派生类型,并根据需要获取数据。

当然,这会创建从Fragment到Activity的依赖关系,但如果它不是一个通用的、可重用的Fragment,那么实现起来非常简单和直接,这意味着你可以获得对当前Activity数据的引用,而不是像Bundle/Parcelable/Serializable策略那样获得一个副本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接