所以我已经知道我需要一个空构造函数,以便我的片段不会因重新初始化而崩溃。我的问题是我在初始化时使用了我的片段的数据列表(至少其中一些)。那么用数据列表启动新片段的好方法是什么。我是否应该在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关闭和用户重新启动时维护对象。
答案 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
作为配置更改的一部分保留,因此对于非保留实例,这是确保在用户旋转屏幕时保留设置数据等的方法。