Как вернуться к предыдущему фрагменту из activity?
у меня есть приложение с навигационным ящиком, которое переключает фрагменты. Изнутри одного из этих фрагментов я вызываю новую активность. Когда я нажимаю назад в этом действии (на панели инструментов), я хочу вернуться к предыдущему выбранному фрагменту, но вместо этого он возвращает меня к первому фрагменту. Я добавляю свой фрагмент в задний стек, поэтому это не должно быть проблемой.
вот что я уже пробовал:
Я переопределил метод onBackPressed в моей 2-й деятельности, как это:
@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() метод.
8 ответов
У меня была та же проблема и исправлена. Единственное, что вам нужно сделать, это переопределите метод "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 - ваш первый фрагмент в меню.
что я, как правило, это
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
this.finish();
} else {
super.onBackPressed(); //replaced
}
}
таким образом, он обрабатывает фрагмент материала самостоятельно внутри, но когда нет фрагментов, чтобы вернуться, то он заканчивает работу.
EDIT: up navigation может воссоздать вашу предыдущую активность, даже если она уже существует. Чтобы этого не произошло, переопределите 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) { ... }
.
когда вы вызываете действие из фрагмента другого действия, то состояние экземпляра предыдущего действия, которое является вызывающим действием, которое имело состояние экземпляра фрагмента, будет сохранено в стеке...поэтому все, что вам нужно сделать, это закончить вызываемое действие, и у будет фрагмент, из которого вы вызвали свое второе действие.
@Override
public void onBackPressed() {
finish();
}
Я вижу, что люди все еще пытаются мне помочь. Этот ответ помог мне исправить мою проблему:Android-переход от активности к фрагменту
переопределить onOptionsItemSelected
метод в деятельности следующим образом:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
когда вы вызываете новое действие из фрагмента, вы должны написать:
Intent intent = new Intent(getFragment().getContext(),NewActivity.class);
getFragment().getContext().startActivity(intent);
FragmentManager fm = CurrentFragment.getActivity().getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.addToBackStack(CurrentFragment.class.getName()).commit();
fm.executePendingTransactions();
это работает для меня.