Substitua fragmento por outro fragmento dentro do ViewPager

Estou usando um ViewPager junto com um FragmentPagerAdapter para hospedar três fragmentos diferentes

[Fragment1][Fragment2][Fragment3]

O que estou tentando obter é substituir com êxito o Fragment1 por um fragmento totalmente novo, Fragment4, se uma tarefa específica for bem-sucedid

Quando eu uso ..

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();

.. o fragmento é substituído lindamente e o Fragment4 é mostrado em vez do Fragment1. Embora assim que eu deslize todo o caminho para o Fragment3 e depois volte para o Fragment4, o Fragment1 retorno

Então, novamente, se eu usar ..

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();

.. Fragment1 é removido e quando eu voltar Fragment4 está lá. Portanto, o problema com esta solução é que não consegui encontrar uma maneira de mostrar imediatamente o Fragment4, pois o Fragment1 é removido, mesmo se eu tentasse:

transaction.add(fragment4);
transaction.show(fragment4);

E aqui está como minha implementação FragmentPagerAdapter se parece no momento, sem nenhuma transação gerenciando:

public static class PagerAdapter extends FragmentPagerAdapter {

    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return VIEW_COUNT;
    }

    @Override
    public Fragment getItem(int position) {

        Fragment fragment = null;

        switch (position) {
        case 0:
            fragment = Fragment1.newInstance(context_);
            break;

        case 1:
            fragment = Fragment2.newInstance(context_);
            break;

        case 2:
            fragment = Fragment3.newInstance(context_);
            break;

        default:
            break;
        }

        return fragment;
    }
}

Editar

Então, parece que eu não estava totalmente claro com a minha pergunta. Decidi remover todos os espaguetes que consegui criar anteriormente e tentei afirmar que os havia deixado (veja o texto em negrito acima

e qualquer forma, aqui está o que eu tenho tentado fazer dentro de getItem ():

@Override
public Fragment getItem(int position) {

    Fragment fragment = null;

    switch (position) {
    case 0:

        if (!app.isUserLoggedIn) {
            if (loginFragment_ == null) {
                loginFragment_ = LoginFragment.newInstance(context_);
                transaction_ = fragmentManager_.beginTransaction();

                if (logoutFragment_ != null) {
                    transaction_.remove(logoutFragment_);
                    logoutFragment_ = null;
                }

                transaction_.add(loginFragment_, "login");
                transaction_.commit();
            }

            if (fragmentManager_.findFragmentByTag("login") == null)
                fragment = LoginFragment.newInstance(context_);
            else
                fragment = fragmentManager_.findFragmentByTag("login");

        } else {
            if (logoutFragment_ == null) {                      
                logoutFragment_ = LogoutFragment.newInstance(context_);
                transaction_ = fragmentManager_.beginTransaction();

                if (loginFragment_ != null) {
                    transaction_.remove(loginFragment_);
                    loginFragment_ = null;
                }

                transaction_.add(logoutFragment_, "logout");
                transaction_.commit();
            }

            if (fragmentManager_.findFragmentByTag("logout") == null)
                fragment = LogoutFragment.newInstance(context_);
            else
                fragment = fragmentManager_.findFragmentByTag("logout");
        }
        break;

    case 1:
        fragment = HomeFragment.newInstance(context_);
        break;

    case 2:
        fragment = RegisterFragment.newInstance(context_);
        break;

    default:
        break;
    }

    return fragment;
}

Com esse código, não faço nada, mas se alguém vê o que estou fazendo de errado e gostaria de me indicar a direção correta, eu apreciaria muito!

questionAnswers(6)

yourAnswerToTheQuestion