分段数据处理



我目前正在开发一个Android应用程序。由于我想支持平板电脑和手机,我决定使用碎片。但现在出现了一个问题,与其说是一个具体的错误,不如说是架构问题。

哪个组件负责加载和保存数据:周围的活动还是片段本身?android开发者资源中的所有示例都使用片段中的数据加载。

我的应用程序(简化):

  • ItemActivity(显示ItemListFragment)
  • EditItemActivity(显示EditItemFragment)
  • CreateItemActivity(显示EditItemFragment)
  • ItemListFragment(显示本地SqliteDb中的项目列表)
  • EditItemFragment(允许编辑项目,从中加载和保存SqliteDb)

但我想我现在被卡住了。因此,我的问题更多的是关于最佳实践的一般性问题。

  1. 我想在fragment中设置参数,但这只适用于向活动动态添加片段的情况。那么,在使用修复片段时,如何将参数从活动传递到片段呢
  2. 当活动在生命周期中创建时,我可以访问我的数据库。但我必须决定数据是否应该在生命周期之前加载。onCreate和onCreateView以及savedInstanceState决定我以后是从捆绑包恢复还是从数据库加载。那么,我应该在onCreate中存储是否从数据库加载,或者有更好的方法吗

FOA我建议您在智能手机的选项卡和活动中只使用片段,而不是片段。我这么说的原因是:

我的应用程序(简化):

ItemActivity(显示ItemListFragment)
EditItemActivity(表示EditItemFragment

我想前三个也必须是片段。其次,您可以使用任何您想要的数据容器-带有args的Bundle、SharedPreferences,甚至父活动中的一些公共字段
那么,在使用修复片段时,如何将参数从活动传递到片段呢?您可以通过静态方法实例化您的片段,如:

private int photoRes;
public static ViewPagerDetailFragment newInstance(int photoRes) {
final ViewPagerDetailFragment f = new ViewPagerDetailFragment();
f.photoRes = photoRes;
return f;
}

或使用捆绑

Bundle args = new Bundle();
args.putInt(KEY,value);
Fragment fragment = new Fragment();
fragment.setArguments(args);

至于2,我想最好先向用户显示UI,然后进行数据加载,换句话说(在onCreate等中加载数据),它可能看起来像ANR。如果数据量较低,则可以将其加载到onCreate或您想要的任何位置。如果数量很大,最好使用加载器从DB 加载数据

片段应该被视为一种自治实体,因此在大多数情况下,所有数据加载/保存都应该由片段处理或触发。

对于向片段传递参数,可以重新编写代码并在代码中传递参数,也可以从片段中公开公共方法。

至于访问数据库——只要你想使用这些数据,就访问它。

您还可以使用Otto库,并将单例模型作为数据的生产者和Fragments订阅者。

您肯定希望加载片段中的数据。我猜你的一些活动只针对手机布局,如果你在一个更大的设备上,你会把一些片段组合成一个活动。也许稍后您将决定在其他活动中重用这些片段(甚至嵌套在其他片段中)。因此,您应该致力于使每个片段尽可能独立。尽量不要把它们和你的活动联系起来。

这包括从数据库加载数据。是否有特定的原因导致您的数据库必须加载在活动中而不是片段中?也许您需要一个上下文来加载数据库:您可以使用Fragment#getActivity()来获取一个上下文。如果您需要确保"活动"已经创建并且视图已经设置,那么还有Fragment#onActivityCreated(savedInstanceState)。如果我是你,我会在Fragment的onActivityCreated方法中加载你的数据。我肯定会使用CursorLoader,这样它就不会减慢UI的速度,也不必担心管理它

如果你仍然需要与"活动"中的固定片段对话(你可能会这样做),你可以从"活动"的片段管理器中获取片段,如下所示:

FragmentManager fm = getFragmentManager();
(MyFragment) myFragment = (MyFragment)fm.findFragmentByTag(tagName);

只需确保在XML中为片段设置一个标记名即可。(您也可以通过id分配和查找您的片段;请使用FragmentManager#findFragmentById()。)

实际上,如果您需要在创建Fragment之前设置参数,最好是动态设置。

据我所知,周围活动的生命周期负责加载和保存数据。在Activity.onResume()中,您可以触发片段字段的初始化。

最新更新