一行代码解决activity 重建 fragment 重叠问题

想必用过fragment 的同学一定都有遇到过fragment 的重叠问题吧,原因在于我们在activity的onCreate方法中创建并添加了fragment,而activity一旦销毁 重建onCreate方法就会执行,如果销毁之前保存了fragemnt的相关信息,那么activity就会进行恢复,当创建与恢复同时存在的时候activity就存在两个fragment了。

我的要求是:1,杜绝fragment重叠问题的出现;2,尽量在activity销毁的时候保存足够的信息以便重建时恢复

 

我参考了不少方法,但觉得都达不到我的要求,现在提供本人的解决方案,看看你们是否会有相同的需求:

 

首先我的activity是继承至 AppCompatActivity,而AppCompatActivity是继承至 FragmentActivity,我们看看FragmentActivity中

onSaveInstanceState方法是如何实现的:
/**
 * Save all appropriate fragment state.
 */
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Parcelable p = mFragments.saveAllState();
    if (p != null) {
        outState.putParcelable(FRAGMENTS_TAG, p);
    }
    if (mPendingFragmentActivityResults.size() > 0) {
        outState.putInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG, mNextCandidateRequestIndex);

        int[] requestCodes = new int[mPendingFragmentActivityResults.size()];
        String[] fragmentWhos = new String[mPendingFragmentActivityResults.size()];
        for (int i = 0; i < mPendingFragmentActivityResults.size(); i++) {
            requestCodes[i] = mPendingFragmentActivityResults.keyAt(i);
            fragmentWhos[i] = mPendingFragmentActivityResults.valueAt(i);
        }
        outState.putIntArray(ALLOCATED_REQUEST_INDICIES_TAG, requestCodes);
        outState.putStringArray(REQUEST_FRAGMENT_WHO_TAG, fragmentWhos);
    }
}

标红代码看到了吧:

Parcelable p = mFragments.saveAllState();

if (p != null) { outState.putParcelable(FRAGMENTS_TAG, p); }

发在这个地方对fragemnt的信息进行了保存,那么我们只需将保存的信息置空即可,即复写onSaveInstanceState方法如下所示:

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelable("android:support:fragments", null);
}

这样做仅仅是不保存fragment的信息,而其他的信息还是会保存的,同时解决了fragment重叠的问题

 

展开阅读全文

没有更多推荐了,返回首页