将初始数据提供给片段的正确方法?

时间:2012-05-29 11:46:10

标签: android android-fragments

所以我已经知道我需要一个空构造函数,以便我的片段不会因重新初始化而崩溃。我的问题是我在初始化时使用了我的片段的数据列表(至少其中一些)。那么用数据列表启动新片段的好方法是什么。我是否应该在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直接在片段中设置数据吗?但是,如果用户按下home,android关闭片段并且用户稍后返回,我不会丢失数据吗?

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

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

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

1 个答案:

答案 0 :(得分:73)

  

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

使用工厂模式和“参数”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作为配置更改的一部分保留,因此对于非保留实例,这是确保在用户旋转屏幕时保留设置数据等的方法。