Как сохранить состояние фрагмента в android?

У меня есть одна HomeActivity, откуда я вызываю список фрагментов. В HomeActivity у меня есть сайдменю, куда загружаются все фрагменты.

Теперь в этом списке у меня есть один фрагмент под названием HomeFragment, который отображает карту Google с данными, используя веб-сервис.

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

Мой HomeFragment или любые другие фрагменты загружаются сразу, а не каждый раз.


person Sumit Pansuriya    schedule 24.02.2017    source источник
comment
Вам нужно использовать транзакцию скрытия / отображения фрагмента вместо отсоединения, удаления, замены и т. Д.   -  person EpicPandaForce    schedule 24.02.2017
comment
Для загрузки данных и их сохранения даже при повторном создании действия это можно сделать с помощью загрузчика (например, AsyncTaskLoader). Вот пример того, как его использовать: stackoverflow.com/a/22675607/878126   -  person android developer    schedule 24.02.2017


Ответы (2)


Вы можете скрыть / показать фрагмент. Не нужно заменять, снимать. Например, у меня есть 2 фрагмента FragmentFeed и FragmentNotification, мы можем скрыть / показать или добавить фрагмент.

Обработка контекстного меню:

if (tabId.equals(AppConstants.FEED)) {
                    pushFragments(tabId, getFragmentFeed());
                } else if (tabId.equals(AppConstants.NOTIFICATION)) {
                    pushFragments(tabId, getFragmentNotification());
                }

Обработайте отображение / скрытие и добавьте фрагмент:

public void pushFragments(String tag, Fragment fragment) {

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();


        if (manager.findFragmentByTag(tag) == null) {
            ft.add(R.id.realtabcontent, fragment, tag);
        }

        Fragment fragmentFeed = manager.findFragmentByTag(TAG_FEED);
        Fragment fragmentNoti = manager.findFragmentByTag(TAG_NOTIFICATION);

        // Hide all Fragment
        if (fragmentFeed != null) {
            ft.hide(fragmentFeed);
        }
        if (fragmentNoti != null) {
            ft.hide(fragmentNoti);
        }

        // Show  current Fragment
        if (tag == TAG_FEED) {
            if (fragmentFeed != null) {
                ft.show(fragmentFeed);
            }
        }
        if (tag == TAG_NOTIFICATION) {
            if (fragmentNoti != null) {
                ft.show(fragmentNoti);
            }
        }



        ft.commitAllowingStateLoss();
    }
person RoShan Shan    schedule 24.02.2017
comment
Спасибо @RoShan Shan. У меня это работает. Это сэкономит мне пару часов. - person Sumit Pansuriya; 24.02.2017
comment
Спас мою жизнь!! - person mychemicalro; 02.10.2018

Вам следует использовать две вещи.

Сначала onSavedInstance вашего фрагмента. Заполните его нужной информацией.

Второй setRetainState (true). Это предотвратит разрушение вашего фрагмента, даже если он будет отсоединен. Надеюсь это поможет.

person T.Dimitrov    schedule 24.02.2017