【发布时间】:2012-06-03 15:18:22
【问题描述】:
所以我了解到我需要一个空的构造函数,以使我的片段不会在重新初始化时崩溃。我的问题是我在初始化片段时使用数据列表(至少其中一些)。那么用数据列表开始新片段的好方法是什么。我应该在OnCreate() 中创建一个getData 方法来从其他来源获取数据还是什么是正确的方法?
向捆绑包提供数据确实不是一个很好的方法,因为我有很多数据。
让我们举一个案例(我这样理解更好)。
当用户单击按钮时,片段会启动。我以前做的是这样创建一个新片段:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.center_container, new DetailFragment(item));
fragmentTransaction.addToBackStack(DETAIL_TAG);
fragmentTransaction.commit();
然后在我的片段中:
public DetailFragment(EventItem item) {
mItem = item;
mPlaces = Database.getContainerPlaces(getActivity()).getValidItems();
}
我不能将所有数据都提供给一个包,所以这行不通。那我该怎么办?
A:我应该使用空构造函数初始化片段,然后从我的活动中使用 setter 直接在片段中设置数据吗?但是,如果用户按 home 键,Android 关闭片段并且用户稍后返回,我不会丢失数据吗?
B:我是否应该使用工厂模式初始化片段并调用setRetainInstance(true),给片段一个用于识别数据的键,然后让片段从某个第三方来源获取 onCreateView 中所需的数据?
C:我应该只创建一个空的构造函数,然后在onCreate() 中获取片段所需的数据吗?
应该注意的是,应用是纵向锁定的,所以问题主要在于在 Android 关闭和用户重新启动时维护对象。
【问题讨论】:
-
为什么不只创建一个无头片段和 setReatinedInstance(true) 并在片段上放置一个标签,当你重新开始时,然后使用片段管理器中的标签获取片段。您可以将所有数据放在无头片段中,然后调用 getData。是不是很简单!
-
@AZ_ 除了我需要另一个片段来包含视图,这意味着两个片段只会降低代码的可读性。
-
我认为这将使您的代码更加健壮。只需声明一个内部无头片段 setRetainedInstance(true),您也可以将其用作后台工作线程,这是 Google 推荐的解决方案。我在 developer.android.com 某处读到
-
@AZ_ 是的,但是处理线程和处理数据是两件不同的事情。如果我有一些线程要处理,我会同意你的看法,但如果它只是原始数据,那么工厂模式就是要走的路。这也是谷歌根据他们自己的文档所做的方式:developer.android.com/guide/components/fragments.html