Intereting Posts
Как реализовать пользовательский интерфейс заполнителя в качестве экрана запуска Андроид XML-тег называется eat-comment, каково его использование? Как установить другой заголовок для диалогового окна оповещения при загрузке страницы WebView? Ошибка аутентификации Wifi в Android Android – Использование пользовательского шрифта Обновление пользовательского интерфейса Android с помощью потоков Android.text.format.Time необходимости замены, поскольку она устарела Почтовый многопользовательский запрос с Android SDK Ошибка камеры 10000 андроида – что это такое? Как быстро проверить, доступен ли сервер URL-адресов Android-L CardView Visual Touch Обратная связь Удаление вызова из журнала вызовов после завершения вызова Разница между Camera.translate и Matrix.preTranslate или Matrix.postTranslate? Как нарисовать путь на холсте Android с анимацией? Изменение ориентации ориентации экрана при запуске AsyncTasks

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

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

Solutions Collecting From Web of "Android – addToBackStack () не работает?"

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

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

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

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

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

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

Вы должны использовать статический метод, например ContentFragment.getInstance(<params>) чтобы создать свой Fragment .

См. Дополнительную информацию по адресу: http://developer.android.com/reference/android/app/Fragment.html в разделе «Обзор класса».

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

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

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

Я добавлял, не заменяя, но мне пришлось вызвать 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();