Android Navigation entre des fragments à l'aide d'un backstack et d'un motif de tissu statique


Exemple

Tout d'abord, nous devons ajouter notre premier Fragment au début, nous devrions le faire dans la méthode onCreate() de notre activité:

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

Ensuite, nous devons gérer notre backstack. La manière la plus simple consiste à utiliser une fonction ajoutée dans notre activité et utilisée pour toutes les 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();
}

Enfin, nous devrions remplacer onBackPressed() pour quitter l’application en revenant du dernier fragment disponible dans le backstack.

@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();
    }
}

Exécution en activité:

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

Exécution en dehors de l'activité (en supposant que MainActivity est notre activité):

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