片段重新创建两次

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 的状态在某种程度上是多余的,这使得 fragmentonCreateView() 触发了两次。所以只恢复片段状态本身就可以了。