Ignorar alguns fragmentos noBackPressed

Eu sou bastante novo com fragmentos de Android, por favor, tenha paciência comigo.

Eu tenho um monte de fragmentos usando uma única atividade como host.

Na minha opinião, meus fragmentos são agrupados por seções, embora ainda sejam modulares / reutilizáveis por código. Considere este cenário desejado:

Frag1 -> (Pressione Avançar) -> Frag2 -> (Pressione Avançar) -> Frag3 -> (Pressione Voltar) -> Frag1

Depois de passar por uma série de fragmentos, eu gostaria de pular alguns fragmentos anteriores (neste cenário, pule o Frag 2) ao pressionar o botão Voltar.

No entanto, no meu código atual, meu problema é que, mesmo voltando ao Frag1, o Frag3 não desaparece da tela. O que acontece é que o Frag1 e o Frag3 ficam visíveis um sobre o outro.

Aqui estão meus trechos de código relevantes:

Fragmento de código para criar 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 criar 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 criar 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();
}

Minha solução atual para isso é adicionando.addToBackStack(null) na criação do Frag3 e na execução desse código

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

logo após chamar o método onBackPressed (). Infelizmente, essa solução alternativa é feia porque há uma aparência de fração de segundo do Frag2 antes de ir para o Frag1.