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

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

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

Я переопределил метод 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 ().

Solutions Collecting From Web of "Как вернуться к предыдущему фрагменту из активности?"

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

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

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

EDIT: Навигация вверх может воссоздать предыдущую активность, даже если она уже существует. Чтобы этого не произошло, переопределите событие навигации 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); } 

У меня была такая же проблема и исправлена. Единственное, что вам нужно сделать, это переопределить метод «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 – ваш первый фрагмент в меню.

Пытаться

 getFragmentManager().popBackStackImmediate(); 

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

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

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

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

Я вижу, что люди все еще пытаются мне помочь. Этот ответ помог мне исправить мою проблему: Android – Навигация вверх от Activity to Fragment