Как вернуться к предыдущему фрагменту из 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 - ваш первый фрагмент в меню.


попробовать

getFragmentManager().popBackStackImmediate();

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


что я, как правило, это

@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();

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