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");