Activityがrecreate()を再起動してViewPagerと一緒に使用すると発生した問題

5599 ワード

activity再起動activity.recareate()しかし、起動が速い場合、すなわちviewPagerfragmentを追加するまで時間がかからない操作が現れる.
この場合、システムは、破棄されていないfragmentviewPagerに再添付し、新たに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を再起動するには、Activityrecareate()メソッドから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がタイムリーに作成されます.