80,351
社区成员
发帖
与我相关
我的任务
分享
private FragmentManager fm;
/**
* 删除内存中所有缓存的fragment,以防止oom
*/
private void removeAllFragments() {
if (fm.getFragments() != null) {
FragmentTransaction ft = fm.beginTransaction();
for (Fragment fragment : fm.getFragments()) {
if (fragment != null) {
ft.remove(fragment);
}
}
ft.commit();
}
}
这是我之前写的一个很粗暴的清除内存中fragment的方法。还有一种就是重写FragmentPagerAdapter中的instantiateItem方法。以下是instantiateItem的源码:
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
private static String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
无非是通过adapter的container,也就是list view的id和该fragment的position去给这个fragment命了个名。然后在根据这个名字在内存中获取,若为空则新建并存在一个FragmentTransaction的对象中,而且整个方法中只有添加,没有移除。所以你可以重写这个方法,在适当的地方添加移除操作就行了。