【发布时间】:2012-06-21 08:20:59
【问题描述】:
我有这个结构:
Activity A 有一个 ViewPager。 ViewPager 的页面称为 Fragment。
Activity A 有一个复杂对象的列表,我想在页面中显示。
当用户单击 ViewPager 活动 B 内的项目时,必须启动。 Activity B 也需要包含复杂对象的列表。
所以我必须通过这个列表
A -> 片段 -> B
首先我发现无法使用片段的构造函数向其传递数据。我必须使用可打包或可序列化的。在片段中,我必须再次打包或序列化以传递给 B。
但我不想序列化或打包整个复杂数据列表 2 次,只是为了将其传递给 B。
我想避免使用静态字段。
然后我想到将一个侦听器传递给片段,该片段侦听项目点击,并通知我的活动 A 和活动 A 然后使用数据启动活动 B。这对我来说看起来最干净,因为 A 实际上是数据所属的,所以 A 从数据开始片段,片段回到 A,然后 A 从数据开始 B。我不必到处传递数据(序列化!)。
但这似乎不起作用,因为如何使用序列化将侦听器传递给片段?在片段中使用监听器返回活动有什么问题?
我该如何解决这个问题?
编辑
我在一个关于对话片段的帖子中找到了这个解决方案:Get data back from a fragment dialog - best practices?
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
所以我将它添加到我的片段中并让我的活动实现某些接口。
这将解决将数据从片段传递到 B 的问题。但我仍然需要将列表从 A 传递到片段。可能我必须使用 Parcelable...
编辑:我试过Parcelable,它可以工作。但是我列表中的对象有很多字段,它们之间也有映射,例如。编写 Parcelable 代码(写/读)是一种痛苦。也许我只是坚持静态数据...
【问题讨论】:
-
我遇到了同样的问题。我的复杂数据是使用片段计算并显示在活动 A 中的列表中,但详细信息将使用片段显示在活动 B 中,或者在同一活动中的两个窗格布局中显示,但细节片段不同。我完全不知道,只能打包我的详细数据,这很痛苦……你有没有更好的想法?例如将其作为中间媒介放在应用程序对象中?
标签: android android-activity fragment