Страница 1 из 1

Сохранение состояний Фрагментов

Добавлено: 18 фев 2015, 13:29
Sk_games
Всем хорошего дня. Может кто подсказать, зачем использовать сохранение состояний фрагментов, не считая смены ориентации. Я прочитал в руководстве, что фрагменты добавлены в БекСтек сохраняют свои состояния, и для них не нужно прописывать SavedInstance, или есть еще и другие случаи? Зачем вообще это, и в каких целях используют?

Re: Сохранение состояний Фрагментов

Добавлено: 18 фев 2015, 15:19
Mikhail_dev
Они не сохраняют состояние при смене ориентации. Чтобы они сохраняли состояние, надо им прописать setRetainInstance(true)

Re: Сохранение состояний Фрагментов

Добавлено: 18 фев 2015, 16:24
Sk_games
Mikhail_dev
Ладно, если не трогать смену ориентации. Стоит вообще сохранять инстансы, просто листая фрагменты программы? И можно еще такой вопрос. Вот прописал для 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();
        }

    }

Re: Сохранение состояний Фрагментов

Добавлено: 18 фев 2015, 16:58
Mikhail_dev
Ладно, если не трогать смену ориентации. Стоит вообще сохранять инстансы, просто листая фрагменты программы? И можно еще такой вопрос. Вот прописал для 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]
Так вот мы можем через Drawer много раз перейти на разные фрагменты этого списка, и в одно нажатие "Назад, вернутся сразу в главный экран, а не через "много раз" назад.
Без проблем. Уберите строчку ft.addToBackStack(backStateName);

Re: Сохранение состояний Фрагментов

Добавлено: 18 фев 2015, 17:47
Sk_games
Без проблем. Уберите строчку ft.addToBackStack(backStateName);
Проблема в том, что она должна быть, хотя бы один раз, что бы вернутся в предыдущее меню.

На счет первого. Я добавляю в бекстек уникальную строку - пекедж этого фрагмент класса. После этого, мне надо мне надо проверить стек, на наличие такой же строки, если она уже есть - добавлять в стек, если нет не добавлять. (Мой костыль был в том, что я сделал такую проверку, не совсем грамотно, и думаю есть более умные :) решения)

Re: Сохранение состояний Фрагментов

Добавлено: 18 фев 2015, 22:30
Mikhail_dev
Проблема в том, что она должна быть, хотя бы один раз, что бы вернутся в предыдущее меню.
А зачем вам показывать последний фрагмент, но при этом предпоследние не показывать?

Re: Сохранение состояний Фрагментов

Добавлено: 23 фев 2015, 13:15
Sk_games
У меня не получается как то объяснить :) Примером есть Drawer, в нем список вещей, разных. Мы через него три раза зашли на разные вещи, и потом кнопкой назад возвращаемся три раза по тем же самым вещам (что не должно быть) и потом в главное меню. А если убрать стек, тогда кнопкой назад он просто будет выходить из приложения.

Re: Сохранение состояний Фрагментов

Добавлено: 23 фев 2015, 13:20
Foenix
Sk_games писал(а):У меня не получается как то объяснить :) Примером есть Drawer, в нем список вещей, разных. Мы через него три раза зашли на разные вещи, и потом кнопкой назад возвращаемся три раза по тем же самым вещам (что не должно быть) и потом в главное меню. А если убрать стек, тогда кнопкой назад он просто будет выходить из приложения.
Правильно. Если уровни верхние то должно выходить. Я просто защиту делаю пишу тост "для выхода нажмите ещё раз"

Re: Сохранение состояний Фрагментов

Добавлено: 23 фев 2015, 13:31
Foenix
Вообще то это не правильно ходить н.д. по зависимым фрагментам.. Но если хочешь возвращаться к первому добавь его в стек а по кнопке назад переходит командой popbackstack с указанием фрагмента куда нужно вернуться т.е. его присвоенному алиасу например