Хранить экземпляры фрагментов внутри 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);
Вы можете повторить эту операцию для нескольких фрагментов