заменить фрагмент без onDestroy - PullRequest
2 голосов
/ 03 апреля 2012

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

Я переключаюсь между фрагментами с помощьючто-то вроде этого:

private Fragment myFragment1;
private Fragment myFragment2;
......
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.main_fragment, myFragment2);
ft.commit();

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

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

Итак, вопрос: Как я могу изменить свой код, чтобы сохранить все мои фрагменты в памяти? Я хотел бы иметь сонет как:

Fragment1.onPause();
Fragment2.onResume();

А не:

Fragment1.onPause();
Fragment1.onStop();
Fragment1.onDestroy();
Fragment2.onCreate();
Fragment2.onResume();

Еще одна вещь, я использую android.support.v4.app.Fragment на Android 2.2 и более.

Большое спасибо!

РЕДАКТИРОВАТЬ 1:

Я нашел некоторую помощь и выполнил эту функцию:

private void changeFragement(Fragment f, String fragmentTag) {
    try {
        if (f != null && fragmentTag != null) {

            fm = getSupportFragmentManager();
            ft = fm.beginTransaction();
            Fragment currentFragment = fm.findFragmentById(R.id.main_fragment);
            if (currentFragment != null)
                ft.hide(currentFragment);

            Fragment cachedFragment = fm.findFragmentByTag(fragmentTag);
            if (cachedFragment == null)
                ft.add(R.id.main_fragment, f, fragmentTag);
            else
                ft.show(f);              

            /*Fragment cachedFragment = fm.findFragmentByTag(fragmentTag);
            if (cachedFragment == null)
                cachedFragment = f;
            ft.replace(R.id.main_fragment, cachedFragment, fragmentTag);*/

            ft.addToBackStack(null);
            ft.commit();

        }
    } catch (IllegalStateException err) {
    }
}

Проблема в том, что фрагменты не очень хорошо заменены, я не очень хорошо понимаю "ft.addToBackStack (null);" ... Не могли бы вы помочь мне исправить этот код?

1 Ответ

1 голос
/ 03 апреля 2012

Вы не можете. Android управляет жизненным циклом действий, служб и т. Д., Включая фрагменты. Вам нужно заново подумать, что вы делаете это.

Я знаю, что есть что-то про "фоновые" фрагменты в документе. Может быть, вы могли бы выполнить загрузку в этом и поделиться некоторым состоянием с другими фрагментами, которые вы отображаете / скрываете?

...