Сохранение состояний Фрагментов
Сохранение состояний Фрагментов
Всем хорошего дня. Может кто подсказать, зачем использовать сохранение состояний фрагментов, не считая смены ориентации. Я прочитал в руководстве, что фрагменты добавлены в БекСтек сохраняют свои состояния, и для них не нужно прописывать SavedInstance, или есть еще и другие случаи? Зачем вообще это, и в каких целях используют?
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Сохранение состояний Фрагментов
Они не сохраняют состояние при смене ориентации. Чтобы они сохраняли состояние, надо им прописать setRetainInstance(true)
Re: Сохранение состояний Фрагментов
Mikhail_dev
Ладно, если не трогать смену ориентации. Стоит вообще сохранять инстансы, просто листая фрагменты программы? И можно еще такой вопрос. Вот прописал для backStack'a ужасные костыли (добавляю стринги тэга в массив, и при каждой транзакции проверяю, если ли этот тэг в массиве, если нет, добавляю в массив тэг и addToBackStack этого фрагмента) так как по другому ответа не нашел. Сколько не листал StackOverFlow, свой ответ я там не нашел.
Текущая реализация примерно такая (без массива, его я пока оставил для себя). Есть ли более адекватное решение? Получается у меня есть Drawer с списком, по тапу на списком переходим в другой фрагмент. Так вот мы можем через Drawer много раз перейти на разные фрагменты этого списка, и в одно нажатие "Назад, вернутся сразу в главный экран, а не через "много раз" назад.
Надеюсь получилось объяснить. мне хотелось бы, что бы каждый стринг (fragment.getClass().getName();) сохранялся в Back Stack один раз.
Примерно такой код, сейчас:
Ладно, если не трогать смену ориентации. Стоит вообще сохранять инстансы, просто листая фрагменты программы? И можно еще такой вопрос. Вот прописал для backStack'a ужасные костыли (добавляю стринги тэга в массив, и при каждой транзакции проверяю, если ли этот тэг в массиве, если нет, добавляю в массив тэг и addToBackStack этого фрагмента) так как по другому ответа не нашел. Сколько не листал StackOverFlow, свой ответ я там не нашел.
Текущая реализация примерно такая (без массива, его я пока оставил для себя). Есть ли более адекватное решение? Получается у меня есть Drawer с списком, по тапу на списком переходим в другой фрагмент. Так вот мы можем через Drawer много раз перейти на разные фрагменты этого списка, и в одно нажатие "Назад, вернутся сразу в главный экран, а не через "много раз" назад.
Надеюсь получилось объяснить. мне хотелось бы, что бы каждый стринг (fragment.getClass().getName();) сохранялся в Back Stack один раз.
Примерно такой код, сейчас:
Код: Выделить всё
private void replaceFragment (Fragment fragment){
String backStateName = fragment.getClass().getName();
FragmentManager manager = getSupportFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) {
FragmentTransaction ft = manager.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
R.anim.slide_back_in_left, R.anim.slide_back_out_right);
ft.replace(R.id.frgmCont, fragment);
ft.addToBackStack(backStateName);
ft.commit();
}
}
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Сохранение состояний Фрагментов
Я вас не понимать. Какие инстансы? какие костыли?Ладно, если не трогать смену ориентации. Стоит вообще сохранять инстансы, просто листая фрагменты программы? И можно еще такой вопрос. Вот прописал для backStack'a ужасные костыли (добавляю стринги тэга в массив, и при каждой транзакции проверяю, если ли этот тэг в массиве, если нет, добавляю в массив тэг и addToBackStack этого фрагмента) так как по другому ответа не нашел. Сколько не листал StackOverFlow, свой ответ я там не нашел.
Лично я так добавляю фрагмент и проблем с бекстеком у меня нет.
[syntax=java]
private void showPasswordFragment() {
PasswordFragment passwordFragment = (PasswordFragment)
getSupportFragmentManager().findFragmentByTag(F_PASSWORD);
if (passwordFragment == null) {
passwordFragment = new PasswordFragment();
}
FragmentTransaction editAttrTransaction = getSupportFragmentManager().beginTransaction();
editAttrTransaction.replace(R.id.container, passwordFragment, F_PASSWORD);
editAttrTransaction.addToBackStack(null);
editAttrTransaction.commit();
}
[/syntax]
Без проблем. Уберите строчку ft.addToBackStack(backStateName);Так вот мы можем через Drawer много раз перейти на разные фрагменты этого списка, и в одно нажатие "Назад, вернутся сразу в главный экран, а не через "много раз" назад.
Re: Сохранение состояний Фрагментов
Проблема в том, что она должна быть, хотя бы один раз, что бы вернутся в предыдущее меню.Без проблем. Уберите строчку ft.addToBackStack(backStateName);
На счет первого. Я добавляю в бекстек уникальную строку - пекедж этого фрагмент класса. После этого, мне надо мне надо проверить стек, на наличие такой же строки, если она уже есть - добавлять в стек, если нет не добавлять. (Мой костыль был в том, что я сделал такую проверку, не совсем грамотно, и думаю есть более умные
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Сохранение состояний Фрагментов
А зачем вам показывать последний фрагмент, но при этом предпоследние не показывать?Проблема в том, что она должна быть, хотя бы один раз, что бы вернутся в предыдущее меню.
Re: Сохранение состояний Фрагментов
У меня не получается как то объяснить
Примером есть Drawer, в нем список вещей, разных. Мы через него три раза зашли на разные вещи, и потом кнопкой назад возвращаемся три раза по тем же самым вещам (что не должно быть) и потом в главное меню. А если убрать стек, тогда кнопкой назад он просто будет выходить из приложения.
Re: Сохранение состояний Фрагментов
Правильно. Если уровни верхние то должно выходить. Я просто защиту делаю пишу тост "для выхода нажмите ещё раз"Sk_games писал(а):У меня не получается как то объяснитьПримером есть Drawer, в нем список вещей, разных. Мы через него три раза зашли на разные вещи, и потом кнопкой назад возвращаемся три раза по тем же самым вещам (что не должно быть) и потом в главное меню. А если убрать стек, тогда кнопкой назад он просто будет выходить из приложения.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Сохранение состояний Фрагментов
Вообще то это не правильно ходить н.д. по зависимым фрагментам.. Но если хочешь возвращаться к первому добавь его в стек а по кнопке назад переходит командой popbackstack с указанием фрагмента куда нужно вернуться т.е. его присвоенному алиасу например
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
