所谓的回退栈管理其实就是将事务添加到栈中,每次popBackStack返回之前的状态。事务回滚。
/**
* 跳转到特定的 Fragment
*
* @param containerViewId fragment 容器 id
* @param fragment 对象
* @param tag 标识
*/
public void switchToFragment(int containerViewId, Fragment fragment, String tag) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
List<Fragment> currentFragments = getSupportFragmentManager().getFragments();
// 不是第一个 fragment 时,设置转场动画,隐藏上一个 fragment,并将其加入返回栈中
if (currentFragments.size() != 0) {
ft.setCustomAnimations(R.anim.push_in_from_right, R.anim.push_out_to_left,
R.anim.push_in_from_left, R.anim.push_out_to_right);
Fragment currentFragment = currentFragments.get(currentFragments.size() - 1);
ft.hide(currentFragment).addToBackStack(currentFragment.getTag());
}
if (fragment.isAdded()) {
ft.show(fragment);
} else {
ft.add(containerViewId, fragment, tag);
}
ft.commit();
}
/**
* 直接回到栈底,清空 Fragment 回退栈
*/
public void clearFragmentBackStack() {
FragmentManager fm = getSupportFragmentManager();
int count = getSupportFragmentManager().getBackStackEntryCount();
for (int i = 0; i < count; ++i) {
fm.popBackStackImmediate();
}
}
如上管理,添加第一个Fragment时 Fragment1可见
添加第二个Fragment时 Fragment1隐藏,显示Fragment2 事务添加到回退栈.
添加第三个Fragment时 Fragment2隐藏,显示Fragment3 事务添加到回退栈.
值得注意的是,一次
commit()
所有操作作为一次事务添加到回退栈。如上,hide
和add
作为一次事务。
此时int count = getSupportFragmentManager().getBackStackEntryCount();
为2,所以clearFragmentBackStack()
直接回退到Fragment1可见的状态。