片段无法恢复以前的状态

时间:2018-09-12 14:42:51

标签: android android-fragments

我的问题很简单。我正在使用带有TabLayout(而不是Viewpager)的活动使用片段。我所有的片段都继承自具有以下功能的BaseFragment类:

public void pushFragmentAnimated(BaseFragment fragment) {
    mActivity.pushFragmentAnimated(fragment);
}

在活动中,pushFragmentAnimated()是:

public void pushFragmentAnimated(BaseFragment fragment) {
    try {
        mCurrentFragment = fragment;
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right);
        transaction.replace(R.id.fragment_container, fragment, fragment.TAG);
        transaction.addToBackStack(fragment.getFragmentTitle());
        transaction.commit();

        manager.executePendingTransactions();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

问题是,使用此功能,我永远都无法保存片段状态,而当我弹出当前片段时,下面的片段会作为新片段重新加载。

实际上,在我的BaseFragment中,我有两个函数,通常在每个片段中都将其覆盖:

public void initializeFragment() {}

public void setupFragmentData() {}

这些函数在这里被调用:

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = getView();

    if (view == null && savedInstanceState == null) {

        int layoutResource = getFragmentLayout();
        view = inflater.inflate(layoutResource, container, false);

        // ButterKnife bind
        ButterKnife.bind(this, view);

        // Initialization methods
        initializeFragment();
    }

    return view;
}

在这里:

@Override
public void onResume() {
    super.onResume();

    // Initialization methods
    setupFragmentData();
}

和第一个initializeFragment()总是在我弹出片段时被调用,即使它不应该被调用。如您所见,只有第二个应该。

有什么主意吗?

2 个答案:

答案 0 :(得分:0)

我建议您在片段中使用以下代码段:

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    // here you can save your variables value
}

并将您的任意字段保存在 outState 包中。

也如@Isosymmetric所说,您可以看看this的答案。

答案 1 :(得分:0)

那是因为您赚了replace。如果可能-使用add,它应该保存基础片段的状态。如果不可能,请使用解决方案@MilaDroid建议。

顺便说一句,是否有任何特定原因需要使用replace并将其添加到堆栈中?