60

所以我了解到我需要一个空的构造函数,以使我的片段不会在重新初始化时崩溃。我的问题是我在初始化片段时使用数据列表(至少其中一些)。那么用数据列表开始新片段的好方法是什么。我应该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();
}

我不能将所有数据都提供给一个包,所以这行不通。所以我该怎么做?

答:我应该使用空构造函数初始化片段,然后从我的活动中使用 setter 直接在片段中设置数据吗?但是,如果用户按下主页,Android 关闭片段并且用户稍后返回,我不会丢失数据吗?

B:我应该用工厂模式初始化片段并调用setRetainInstance(true),给片段一个识别数据的键,然后让片段从第三个来源获取 onCreateView 中所需的数据吗?

C:我应该只创建一个空的构造函数,然后onCreate()获取片段所需的数据吗?

应该注意的是,该应用程序是纵向锁定的,因此问题主要在于在 Android 关闭和用户重新启动时维护对象。

4

1 回答 1

74

那么用数据列表开始新片段的好方法是什么。

使用工厂模式和“参数” Bundle,例如:

package com.commonsware.empublite;

import android.os.Bundle;

public class SimpleContentFragment extends AbstractContentFragment {
  private static final String KEY_FILE="file";

  protected static SimpleContentFragment newInstance(String file) {
    SimpleContentFragment f=new SimpleContentFragment();

    Bundle args=new Bundle();

    args.putString(KEY_FILE, file);
    f.setArguments(args);

    return(f);
  }

  @Override
  String getPage() {
    return(getArguments().getString(KEY_FILE));
  }
}

如果你保留你的片段实例,你应该能够只使用普通的 setter 将东西放入数据成员中。“参数”Bundle作为配置更改的一部分保留,因此对于非保留实例,这是确保在用户旋转屏幕等时保留设置数据的方法。

于 2012-05-29T11:52:03.537 回答