片段重新创建两次
Fragment recreates twice
我正在尝试恢复 activity 中的当前片段,因为该应用程序有时会在后台被杀死。我使用 putFragment()
将当前片段存储在 onSaveInstanceState()
中,我在 onRestoreInstanceState()
中使用 getFragment()
在应用程序被杀死之前获取当前片段的保存实例,这是在完成的托管 Activity.
主Activity中的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()
片段在foreground/visible时,我故意把整个应用程序放到背景或者说我最小化应用程序,一段时间后,当我 return 到应用程序时,最后一个片段(在这种情况下为 SubCat()
)被恢复回来,但是我还需要保存一些实例片段也是如此。
现在的问题是片段重新创建了两次,首先 cat_id
的真实值是从 onActivityCreated()
中的 bundle 中检索到的,但是片段是如何重新创建的,此时时间 onActivityCreated()
未被调用,这使得 cat_id
的值为空。
片段:
@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");
}
}
我不知道我做错了什么,请帮忙,在此先感谢。
最后我通过删除 MainActivity 中的 onSaveInstanceState()
和 onRestoreInstanceState()
解决了这个问题。
恢复 activity
中的 fragment
以及恢复 fragment
的状态在某种程度上是多余的,这使得 fragment
的 onCreateView()
触发了两次。所以只恢复片段状态本身就可以了。
我正在尝试恢复 activity 中的当前片段,因为该应用程序有时会在后台被杀死。我使用 putFragment()
将当前片段存储在 onSaveInstanceState()
中,我在 onRestoreInstanceState()
中使用 getFragment()
在应用程序被杀死之前获取当前片段的保存实例,这是在完成的托管 Activity.
主Activity中的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()
片段在foreground/visible时,我故意把整个应用程序放到背景或者说我最小化应用程序,一段时间后,当我 return 到应用程序时,最后一个片段(在这种情况下为 SubCat()
)被恢复回来,但是我还需要保存一些实例片段也是如此。
现在的问题是片段重新创建了两次,首先 cat_id
的真实值是从 onActivityCreated()
中的 bundle 中检索到的,但是片段是如何重新创建的,此时时间 onActivityCreated()
未被调用,这使得 cat_id
的值为空。
片段:
@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");
}
}
我不知道我做错了什么,请帮忙,在此先感谢。
最后我通过删除 MainActivity 中的 onSaveInstanceState()
和 onRestoreInstanceState()
解决了这个问题。
恢复 activity
中的 fragment
以及恢复 fragment
的状态在某种程度上是多余的,这使得 fragment
的 onCreateView()
触发了两次。所以只恢复片段状态本身就可以了。