AddToBackStack не работает, закрывает активность, вместо того, чтобы возвращать фрагменты

У меня есть probleam, и я не могу найти решение где угодно.

Мое приложение не возвращается к предыдущему фрагменту, когда я нажимаю кнопку "Назад", вместо этого закрывает активность.

У меня есть активность, которая отображает 4 фрагмента: [1], [2], [3], [4]. Я могу переключаться между первыми тремя фрагментами с помощью панели действий, я не хочу добавлять их в задний стек.

Фрагмент [4] - подробное представление элемента, выбранного в фрагменте [3]. Когда я вернусь в [4], я хочу вернуться к фрагменту [3], не закрывая приложение.

Переходы выполняются таким образом. АКТИВНОСТЬ, в которой размещены фрагменты:

private void replaceFragment(Fragment fragment, boolean toBackStack){

    if(fragment != null){

        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.container, fragment);

        if(toBackStack)
            fragmentTransaction.addToBackStack(null);

        fragmentTransaction.commit();
    }
}

где toBackStack всегда false, за исключением случаев, когда переход от [3] до [4].

Если я перейду toBackStack true в каждом переходе, действие все равно будет закрыто.

Ответ 1

У меня была та же проблема. В частности, я реализую PreferenceFragment, и я хочу, чтобы кнопка возврата вернула меня к тому, что ранее был загружен.

Похоже, что "задний стек" - это то, что не запускается автоматически с помощью кнопки system. Моим решением было вручную вытащить задний стек из onBackPressed:

@Override
public void onBackPressed()
{
    if (inSettings)
    {
        backFromSettingsFragment();
        return;
    }
    super.onBackPressed();
}

Всякий раз, когда я перехожу к фрагменту моих предпочтений, я устанавливаю inSettings boolean в true, чтобы сохранить это состояние. Вот как выглядит мой метод backFromSettingsFragment:

private void backFromSettingsFragment()
{
    inSettings = false;
    getFragmentManager().popBackStack();
}

Итак, если вы можете отслеживать состояние, когда вы находитесь во Фрагменте [4] и перехватываете кнопку "Назад", вы должны иметь возможность вручную вызывать

getFragmentManager().popBackStack();

чтобы вернуться к фрагменту [3].

Примечание: помните, что вам нужно добавить фрагмент [3] в задний стек, не Фрагмент [4]. (Если [4] не перейдет к [5], и вам также нужно вернуться к [4].)