Хранить экземпляры фрагментов внутри FragmentPagerAdapter

Можно ли сохранить экземпляр каждого фрагмента, созданного для FragmentPagerAdapter внутри FragmentPagerAdapter?

Что-то вроде этого:

@Override
    public Object instantiateItem(ViewGroup container, int position)
        switch(position){
        case 0:
            fragment0 = super.instantiateItem(container, position);
            return fragment0;
        case 1:
            fragment1 = super.instantiateItem(container, position);
            return fragment1;
        default:
            return super.instantiateItem(container, position);
        }
    }

Буду ли я столкнуться с проблемами с памятью?

Идея состоит в том, чтобы сделать что-то вроде MyFragmentPagerAdapter.fragment0 чтобы получить ссылку на фрагмент.

1 ответ

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

Однако безопасным является сохранение ссылки на вашу деятельность в ваших фрагментах.

В своем фрагменте вы переопределяете

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    home = (YourFragmentActivity) activity;
}

public void onCreate(Bundle savedInstanceState) {
            home.setThisFragTag(getTag());
    }

В вашем FragmentActivity

public void ThisFragTag(String tag) {
    this.fragTag = tag;
}

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

(YourFragmentClass) getSupportFragmentManager().findFragmentByTag(fragTag);

Вы можете повторить эту операцию для нескольких фрагментов

Другие вопросы по тегам