【发布时间】:2017-11-30 12:24:59
【问题描述】:
我正在尝试恢复活动中的当前片段,因为应用程序有时会在后台被杀死。我使用putFragment() 将当前片段存储在onSaveInstanceState() 中,并在onRestoreInstanceState() 中使用getFragment() 在应用程序被杀死之前获取当前片段的保存实例,这是在托管活动中完成的。
MainActivity 中的onSaveInstanceState():
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
getSupportFragmentManager().putFragment(outState, "fragment", getSupportFragmentManager()
.findFragmentById(R.id.mainfrag));
super.onSaveInstanceState(outState, outPersistentState);
}
MainActivity() 中的onRestoreInstanceState():
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Fragment current = getSupportFragmentManager().getFragment(savedInstanceState, "fragment");
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (current instanceof SubCat) {
current = new SubCat();
}
ft.replace(R.id.mainfrag, current); //error-line (MainActivity.java:185)
ft.addToBackStack(null);
ft.commit();
}
我使用SubCat() 片段进行测试,它只是应用程序的片段之一,所以当SubCat() 片段在前台/可见时,我故意将整个应用程序置于后台,或者说我最小化了应用程序,一段时间后,当我返回应用程序时,最后一个片段(在这种情况下为SubCat())被恢复回来,但是我还需要保存片段的一些实例。
现在的问题是片段重新创建了两次,首先cat_id的真实值是从onActivityCreated()中的bundle中检索到的,但是片段是如何再次重新创建的,此时onActivityCreated()不是调用它使cat_id 的值为null。
片段:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
arr = new ArrayList<>();
if (getArguments() != null) {
String[] data = getArguments().getStringArray("cat_data");
cat_id = data[0];
cat_name = data[1];
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (view == null) {
view = inflater.inflate(R.layout.fragment_sub_category, container, false);
progress = view.findViewById(R.id.progress);
layoutManager = new LinearLayoutManager(getActivity());
recyclerView = view.findViewById(R.id.recycler);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
subCatAdapter = new SubCatAdapter(arr, getActivity());
recyclerView.setAdapter(subCatAdapter);
subCatAdapter.setOnClickListener(this);
doThis(); //request data from server
}
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("cat_id", cat_id);
outState.putString("cat_name", cat_name);
super.onSaveInstanceState(outState);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
cat_id = savedInstanceState.getString("cat_id");
cat_name = savedInstanceState.getString("cat_name");
}
}
我不知道我做错了什么,请帮忙,提前谢谢。
【问题讨论】:
-
请分享您的错误
-
没有错误,cat_id返回一个空值..这不应该是,它在应用程序进入后台之前有一个值
标签: android android-fragments android-activity android-lifecycle