Activityがrecreate()を再起動してViewPagerと一緒に使用すると発生した問題
5599 ワード
activity
再起動activity.recareate()
しかし、起動が速い場合、すなわちviewPager
にfragment
を追加するまで時間がかからない操作が現れる.この場合、システムは、破棄されていない
fragment
をviewPager
に再添付し、新たにfragment
を作成することはなく、fragment
初期化の際に先にmanager
に破棄されていない標識のtagFragment
を検索し、FragmentPagerAdapter
の一部のソースコード:特に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
がタイムリーに作成されます.