使用 backstack 和靜態結構模式在片段之間導航

首先,我們需要在開頭新增我們的第一個 Fragment,我們應該在我們的 Activity 的 onCreate() 方法中做到:

if (null == savedInstanceState) {
    getSupportFragmentManager().beginTransaction()
      .addToBackStack("fragmentA")
      .replace(R.id.container, FragmentA.newInstance(), "fragmentA")
      .commit();
}

接下來,我們需要管理我們的 backstack。最簡單的方法是在我們的活動中新增一個用於所有 FragmentTransactions 的函式。

public void replaceFragment(Fragment fragment, String tag) {
    //Get current fragment placed in container
    Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container);

    //Prevent adding same fragment on top
    if (currentFragment.getClass() == fragment.getClass()) {
        return;
    }

    //If fragment is already on stack, we can pop back stack to prevent stack infinite growth
    if (getSupportFragmentManager().findFragmentByTag(tag) != null) {
        getSupportFragmentManager().popBackStack(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

    //Otherwise, just replace fragment
    getSupportFragmentManager()
            .beginTransaction()
            .addToBackStack(tag)
            .replace(R.id.container, fragment, tag)
            .commit();
}

最後,當從 Backstack 中可用的最後一個 Fragment 返回時,我們應該覆蓋 onBackPressed() 以退出應用程式。

@Override
public void onBackPressed() {
    int fragmentsInStack = getSupportFragmentManager().getBackStackEntryCount();
    if (fragmentsInStack > 1) { // If we have more than one fragment, pop back stack
        getSupportFragmentManager().popBackStack();
    } else if (fragmentsInStack == 1) { // Finish activity, if only one fragment left, to prevent leaving empty screen
        finish();
    } else {
        super.onBackPressed();
    }
}

活動執行:

replaceFragment(FragmentB.newInstance(), "fragmentB");

執行外部活動(假設 MainActivity 是我們的活動):

((MainActivity) getActivity()).replaceFragment(FragmentB.newInstance(), "fragmentB");