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