【问题标题】:Fragment recreates twice片段重新创建两次
【发布时间】: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


【解决方案1】:

最后我通过删除 MainActivity 中的 onSaveInstanceState()onRestoreInstanceState() 解决了这个问题。 在activity 中恢复fragment 并恢复fragment 的状态在某种程度上是多余的,这使得fragmentonCreateView() 会触发两次。所以只恢复片段状态本身就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多