Android 使用Backstack和静态结构模式在片段之间导航
示例
首先,我们需要Fragment在开始时添加第一个,我们应该使用onCreate()Activity的方法来添加它:
if (null == savedInstanceState) {
getSupportFragmentManager().beginTransaction()
.addToBackStack("fragmentA")
.replace(R.id.container, FragmentA.newInstance(), "fragmentA")
.commit();
}接下来,我们需要管理我们的堆栈。最简单的方法是使用活动中添加的用于所有FragmentTransactions的函数。
public void replaceFragment(Fragment fragment, String tag) {
//获取当前片段放置在容器中
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container);
//防止在顶部添加相同的片段
if (currentFragment.getClass() == fragment.getClass()) {
return;
}
//如果片段已经在堆栈中,我们可以弹出堆栈以防止堆栈无限增长
if (getSupportFragmentManager().findFragmentByTag(tag) != null) {
getSupportFragmentManager().popBackStack(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
//否则,只需替换片段
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(tag)
.replace(R.id.container, fragment, tag)
.commit();
}最后,onBackPressed()当从Backstack中的最后一个Fragment返回时,我们应该重写以退出应用程序。
@Override
public void onBackPressed() {
int fragmentsInStack = getSupportFragmentManager().getBackStackEntryCount();
if (fragmentsInStack > 1) { //如果我们有多个片段,请弹出堆栈
getSupportFragmentManager().popBackStack();
} else if (fragmentsInStack == 1) { //如果只剩下一个片段,请完成活动,以防止离开空白屏幕
finish();
} else {
super.onBackPressed();
}
}活动执行:
replaceFragment(FragmentB.newInstance(), "fragmentB");
执行外部活动(假设MainActivity是我们的活动):
((MainActivity) getActivity()).replaceFragment(FragmentB.newInstance(), "fragmentB");