Omita algunos fragmentos en BackPressed

Soy bastante nuevo con los fragmentos de Android, así que tengan paciencia conmigo.

Tengo un montón de fragmentos que usan una sola actividad como host.

En mi opinión, mis fragmentos están agrupados por secciones, aunque todavía son modulares / reutilizables por código. Considere este escenario deseado:

Frag1 -> (Presione Siguiente) -> Frag2 -> (Presione Siguiente) -> Frag3 -> (Presione Atrás) -> Frag1

Después de pasar por una serie de fragmentos, me gustaría omitir algunos fragmentos anteriores (en este escenario, omitir Frag 2) al presionar el botón Atrás.

Sin embargo, en mi código actual, mi problema es que, aunque vuelve a Frag1, Frag3 no desaparece de la pantalla. Lo que sucede es que tanto Frag1 como Frag3 se hacen visibles uno encima del otro.

Aquí están mis fragmentos de código relevantes:

Fragmento de código para crear Frag1

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    // init the fragment (with a default fragment, not null)
    Fragment fragment = PlaceholderFragment.newInstance(position + 1);
    // Position number from navigation sidebar starts from 0.
    // Since position starts from 0, add 1 to match section number
    // as implemented in {@link #onSectionAttached()}
    switch(position) {
        case 0:
            fragment = PlaceholderFragment.newInstance(position + 1);
            break;
        case 1: // Frag1 case
            fragment = new AddPointsFragment().newInstance(position + 1, "");
            break;
        default:
            break;
    }
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getFragmentManager();
    // clear all fragments from previous section from the back stack
    fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    // replace all currently added fragments in container and replace with the new fragment
    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment)
            .commit();
}

Fragmento de código para crear Frag2

public void onEnterButtonFragmentInteraction(int sectionNumber, String cardNo) {
    // TODO: Add point for given card number
    int points = 5; //sample points
    AddPointsSuccessFragment addPointsSuccessFragment =
            new AddPointsSuccessFragment().newInstance(sectionNumber, cardNo, points);
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, addPointsSuccessFragment)
            .addToBackStack(null)
            .commit();
}

Fragmento de código para crear Frag3

public void onOkButtonFragmentInteraction(int sectionNumber, String cardNo, int points) {
    RedeemRewardFragment redeemRewardFragment =
                new RedeemRewardFragment().newInstance(sectionNumber, cardNo, points);
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.container, redeemRewardFragment);
        fragmentTransaction.commit();
}

Mi solución actual para esto es agregar.addToBackStack(null) al crear Frag3 y ejecutar este código

public void onBackButtonFragmentInteraction() {
    this.onBackPressed(); // simulate pressing of activity back button
    FragmentManager fragmentmanager = getFragmentManager();
    fragmentmanager.popBackStack(); // pop Frag2 from back stack
}

justo después de llamar al método onBackPressed (). Desafortunadamente, esta solución es fea porque hay una apariencia de Frag2 en una fracción de segundo antes de ir a Frag1.

Respuestas a la pregunta(3)

Su respuesta a la pregunta