Ответ 1
Я вижу, что люди все еще пытаются мне помочь. Этот ответ помог мне исправить мою проблему: Android - Навигация вверх от Activity to Fragment
У меня есть приложение с навигационным ящиком, которое переводит фрагменты. Изнутри одного из этих фрагментов я призываю новую деятельность. Когда я нажимаю обратно в этой операции (на панели инструментов), я хочу вернуться к предыдущему выделенному фрагменту, но вместо этого он возвращает мне первый фрагмент. Я добавляю свой фрагмент обратно в стек, поэтому это не должно быть проблемой.
Вот что я уже пробовал:
Я переопределил метод 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().
Я вижу, что люди все еще пытаются мне помочь. Этот ответ помог мне исправить мою проблему: Android - Навигация вверх от Activity to Fragment
У меня была такая же проблема и исправлена. Единственное, что вам нужно сделать, это переопределить метод "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 - ваш первый фрагмент в меню.
Try
getFragmentManager().popBackStackImmediate();
Это сработало для меня.
То, что я обычно делаю, это
@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);
}
Извините, у меня недостаточно репутации, чтобы оставить комментарий. Поэтому я должен угадать. У меня когда-то была такая же проблема.
Похож на проблему, связанную с жизненным циклом действия (http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle). Обязательно добавьте свой первый фрагмент только один раз, потому что ваш менеджер фрагментов активности способен к жизненному циклу.
Таким образом, оператор, который добавляет первый фрагмент к вашему менеджеру фрагментов, должен быть окружен if (savedInstanceState == null) { ... }
.
Когда вы вызываете действие из другого фрагмента действия, тогда предыдущее состояние экземпляра активности, которое является вызывающей активностью, имеющей состояние экземпляра экземпляра, будет сохранено в стеке... так что вам нужно завершить завершение вызываемой активности и u будет иметь фрагмент, из которого вы назвали свою вторую активность.
@Override
public void onBackPressed() {
finish();
}