清理android后台堆栈片段

时间:2017-05-21 18:23:34

标签: android android-fragments fragment-backstack

我目前有一个包含3个可用片段的应用程序,这些片段已替换为底部导航栏。

这是我按下导航栏时调用的方法:

private void setFragment(int id, boolean first) {
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.setCustomAnimations(R.animator.cross_fade, 0);
    switch (id) {
        case R.id.action_discover:
            fragmentTransaction.replace(R.id.frameLayout, fragmentDiscover);
            if(!first) {
                fragmentTransaction.addToBackStack(TAG_DISCOVER);
            }
            break;
        case R.id.action_favorites:
            fragmentTransaction.replace(R.id.frameLayout, fragmentFavorites);
            if(!first) {
                fragmentTransaction.addToBackStack(TAG_FAVORITES);
            }
            break;
        case R.id.action_playlist:
            fragmentTransaction.replace(R.id.frameLayout, fragmentPlaylist);
            if(!first) {
                fragmentTransaction.addToBackStack(TAG_PLAYLIST);
            }
            break;
    }
    fragmentTransaction.commit();
    if(!first) {
        appBarLayout.setExpanded(true, true);
    }
}

当我在这里回复时:

@Override
public void onBackPressed() {
    FragmentManager fm = getFragmentManager();
    String fragmentTag = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName();
    if (fm.getBackStackEntryCount() > 0) {
        fm.popBackStackImmediate(fragmentTag, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        appBarLayout.setExpanded(true, true);
    } else {
        super.onBackPressed();
    }
}

我想要的是什么:

例如,在我打开应用程序后,它将显示片段A(1),然后我打开片段B(2) - > C(3) - > B(4) - > C(5)。如果我按下,由于当前活动片段是C(5),那么它将擦除后栈中的所有片段C(5和3),并移动到片段B(前一个从5 = 4)。在我再次按下之后,它将删除所有片段B(4和2),然后返回到片段A.如果我再次按下它将退出。

简而言之:

A(1) - > B(2) - > C(3) - > B(4) - > C(5)

A(1) - > B(2) - > B(3)

A(1)

退出

即使使用了FragmentManager.POP_BACK_STACK_INCLUSIVE,我得到了:

A(1) - > B(2) - > C(3) - > B(4) - > C(5)

A(1) - > B(2) - > C(3) - > B(4)

A(1) - > B(2) - > C(3)

A(1) - > B(2)

A(1)

退出

对不起解释,有人知道我做错了吗?

0 个答案:

没有答案