有这样一个场景,activity重启 activity.recareate() 但是会出现 如果启动很快,也就是在viewPager中添加fragment之前没有耗时的操作,
这时,系统会将没销毁的fragment重新附加到viewPager中,并没有新建一个fragment,fragment在初始化的时候先去manager中找寻没有销毁的标识的tagFragment,
FragmentPagerAdapter的bu分源码:尤其是instantiateItem方法
public abstract class FragmentPagerAdapter extends PagerAdapter { private static final String TAG = "FragmentPagerAdapter"; private static final boolean DEBUG = false; private final FragmentManager mFragmentManager; private FragmentTransaction mCurTransaction = null; private Fragment mCurrentPrimaryItem = null; public FragmentPagerAdapter(FragmentManager fm) { mFragmentManager = fm; } ..... @Override 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; } ......... public long getItemId(int position) { return position; } private static String makeFragmentName(int viewId, long id) { return "android:switcher:" + viewId + ":" + id; } }
为了重启新建Fragment,我这里给出最简单的方法,在Activity的recareate()方法中移除fragment,
如:
@Override public void recreate() { try {//避免重启太快 恢复 FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); for (Fragment fragment : fragmentAdapter.getFragmentsList()) { fragmentTransaction.remove(fragment); } fragmentTransaction.commitAllowingStateLoss(); } catch (Exception e) { } super.recreate(); }这样在Activity在重启时,就会及时创建新的fragment