Сохранение жизни фрагмента

168
14 сентября 2017, 15:31

Что есть:

У меня в приложении есть BottomNavigationView, в котором находится 3 кнопки, при нажатии на которые идет смена фрагментов в Activity.

Вот таким способом:

 bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            int id = item.getItemId();
            switch (id){
                case R.id.action_dialogs:
                    fragment = new DialogsFragment();
                    break;
                case R.id.action_profile:
                    fragment = new ProfileFragment();
                    break;
                case R.id.action_setting:
                    fragment = new SettingsFragment();
                    break;
            }
            transaction = fragmentManager.beginTransaction();
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            transaction.replace(R.id.fragmentContainer, fragment).commit();
            return true;
        }
    });

Проблема:

Но при переключении фрагментов они заново пересоздаются. Как это исправить?

Всем заранее спасибо!

Answer 1

В самом простом, но не лучшем варианте, Вы можете просто кэшировать фрагменты, если это необходимо. Просто не создавайте их заново с помощью new каждый раз, а сохраните как поля Вашей Activity (но так они не переживут поворот девайса) или как синглтоны. Такой метод далёк от идеала, но в зависимости от того, что Вы делаете, можно воспользоваться им как наиболее простым. В качестве альтернативы вот тут ещё человек предлагает их кэшировать в бэк стеке.

Вообще в пересоздании фрагментов нет ничего плохого. В общем случае лучше было бы добавить возможность сохранить введённые данные и пересоздать фрагмент с определённой информацией, оставшейся от предыдущего, например, сохранить введённые данные в базу или SharedPreferences и прочитать при инициализации фрагмента или передать в качестве аргументов.

READ ALSO
Есть ли в Java класс, реализующий метод с рассчетом RipeMd-128

Есть ли в Java класс, реализующий метод с рассчетом RipeMd-128

Нужно рассчитать для байтового массива сумму по алгоритму RipeMd-128Никак не найду, как

165
Инициализация массива листов

Инициализация массива листов

Нужно задействовать массив листов при инициализации таким образом

172
Изменить значение ключа в файле JSON

Изменить значение ключа в файле JSON

Читаю данные из json с помощью GsonИ в одном активити я хочу изменить значения ключа одного обьекта

359
Android: Не парсится JSON и не выводятся в listview

Android: Не парсится JSON и не выводятся в listview

Я пишу REST клиент, для парсинга JSON'a, я использую для этого Retrofit 2

280