Как вернуться к предыдущему фрагменту из активности?

У меня есть приложение с навигационным ящиком, которое переводит фрагменты. Изнутри одного из этих фрагментов я призываю новую деятельность. Когда я нажимаю обратно в этой операции (на панели инструментов), я хочу вернуться к предыдущему выделенному фрагменту, но вместо этого он возвращает мне первый фрагмент. Я добавляю свой фрагмент обратно в стек, поэтому это не должно быть проблемой.

Вот что я уже пробовал:

Я переопределил метод onBackPressed во втором упражнении вроде этого:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
        this.finish();
    } else {
        getFragmentManager().popBackStack();
    }
}

Он не работает. Я также сохранил индекс текущего фрагмента внутри метода onsaveinstancestate и извлекал его, но тот же результат. Я также старался всегда помещать текущий фрагмент внутри переменной и пытаться выполнить его, но все же, он не работает. Что-нибудь еще, что я мог попробовать?

Интересный факт: если я нажму обратно на нижнюю панель, он действительно вернется к предыдущему фрагменту.

EDIT: Вот мой код для этого:

 private void replaceFragment(Fragment fragment)
 {
     if (fragment != null)
     {
         FragmentManager manager = getSupportFragmentManager();
         manager.beginTransaction()
                    .replace(R.id.main_content, fragment)
                    .addToBackStack(null)
                    .commit();
        }
    }

Я добавляю только первый фрагмент, если savedInstanceState имеет значение null, например:

if (savedInstanceState == null) {
    // first time
    mTitle = getResources().getString(R.string.home);
    replaceFragment(HomeFragment.newInstance()); 
}

И да, все это делается внутри метода onCreate().

Ответ 2

У меня была такая же проблема и исправлена. Единственное, что вам нужно сделать, это переопределить метод "onOptionsItemSelected" в активности:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

android.R.id.home - ваш первый фрагмент в меню.

Ответ 3

Try

getFragmentManager().popBackStackImmediate();

Это сработало для меня.

Ответ 4

То, что я обычно делаю, это

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
        this.finish();
    } else {
        super.onBackPressed(); //replaced
    }
}

Таким образом, он обрабатывает материал фрагмента сам по себе, но когда нет фрагментов, оставшихся для возврата, он завершает действие.

РЕДАКТИРОВАТЬ: Навигация вверх может воссоздать предыдущую активность, даже если она уже существует. Чтобы этого не произошло, переопределите событие навигации Up в onOptionsItemSelected следующим образом:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent parentIntent = NavUtils.getParentActivityIntent(this);
            if(parentIntent == null) { 
                finish();
                return true;
            } else {
                parentIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                startActivity(parentIntent);
                finish();
                return true;
            }
    }
    return super.onOptionsItemSelected(item);
}

Ответ 5

Извините, у меня недостаточно репутации, чтобы оставить комментарий. Поэтому я должен угадать. У меня когда-то была такая же проблема. Похож на проблему, связанную с жизненным циклом действия (http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle). Обязательно добавьте свой первый фрагмент только один раз, потому что ваш менеджер фрагментов активности способен к жизненному циклу. Таким образом, оператор, который добавляет первый фрагмент к вашему менеджеру фрагментов, должен быть окружен if (savedInstanceState == null) { ... }.

Ответ 6

Когда вы вызываете действие из другого фрагмента действия, тогда предыдущее состояние экземпляра активности, которое является вызывающей активностью, имеющей состояние экземпляра экземпляра, будет сохранено в стеке... так что вам нужно завершить завершение вызываемой активности и u будет иметь фрагмент, из которого вы назвали свою вторую активность.

@Override
public void onBackPressed() {
finish();
}