Подтвердить что ты не робот

Android - addToBackStack() не работает?

Это функция, ответственная за добавление фрагментов в задний стек:

public void populateContent(File f)
{

    ContentFragment cf = new ContentFragment(ctx, ac, this);
    FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();;
    cf.updateView(f);

    transaction.replace(R.id.contentFragment, cf);

    transaction.addToBackStack(null);

    transaction.commit();

}

Когда я нажимаю кнопку "Назад", последний фрагмент не загружается (ничего не происходит).

Любая идея, что может быть причиной этого?

Изменить: журнал FragmentManager.

http://pastebin.com/mYnVdkLG

Мне кажется, что мое приложение дважды сохраняет второе представление вместо сохранения первого, а затем второго представления.

4b9b3361

Ответ 1

Я не уверен относительно фактического решения, но могу немного поучить вас и, возможно, вы можете понять, в чем проблема.

Вы фактически заменяете два фрагмента? Если вы этого не сделаете, транзакции не возвращаются. Также ваш первый Fragment добавлен из XML? Менеджер не будет знать об этом фрагменте, и вам может потребоваться добавить первый Fragment, используя транзакцию.

Будьте внимательны, проверяя if (savedInstanceState == null) performFirstTransaction(), иначе вы в конечном итоге добавите свой первый Fragment дважды.

Одна хорошая идея - использовать enableDebugLogging в FragmentManager. Это расскажет вам, о каких фрагментах знает менеджер.

Смотрите это: http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(boolean)

В качестве побочного примечания НЕ рекомендуется использовать пользовательский конструктор для Fragment. Это связано с тем, что если ваше приложение будет убито и повторно создано операционной системой, он вызовет пустой конструктор.

Для создания Fragment используйте статический метод, например ContentFragment.getInstance(<params>).

Подробнее о: http://developer.android.com/reference/android/app/Fragment.html в разделе "Обзор класса".

Надеюсь, мой ответ поможет вам немного решить проблему.

Ответ 2

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

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

Ответ 3

Я добавлял, не заменяя, но мне приходилось вызывать addToBackStack (null) перед добавлением(), а не после, на фрагмент, который будет закрыт, а не на фрагмент, который останется открытым.

В классе A (сначала открыт)

FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();

В классе B (открыт классом A)

FragmentTransaction ft = fm.beginTransaction();
ft.addToBackStack(null);
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();