tsurutanのつぶやき

備忘録としてつぶやきます

ViewPagerの入れ子構造でFragmentが表示されない時の対処

ViewPagerを使ってフラグメントを表示するときに普通 FragmentPagerAdapter を継承したカスタムのAdapterにFragmentManagerを引数として渡すと思いますが、ViewPagerが入れ子構造をしている場合、子のフラグメントのViewが表示されない問題が発生してしまいます。

この問題の対処として

CustomAdapter adapter = CustomAdapter(getActivity().getSupportFragmentManager())

CustomAdapter adapter = CustomAdapter(getChildFragmentManager())

のように書き換えてください。

getChildFragmentManager()の中身がどのようになっているか見てみると

final public FragmentManager getChildFragmentManager() {
        if (mChildFragmentManager == null) {
            instantiateChildFragmentManager();
            if (mState >= RESUMED) {
                mChildFragmentManager.dispatchResume();
            } else if (mState >= STARTED) {
                mChildFragmentManager.dispatchStart();
            } else if (mState >= ACTIVITY_CREATED) {
                mChildFragmentManager.dispatchActivityCreated();
            } else if (mState >= CREATED) {
                mChildFragmentManager.dispatchCreate();
            }
        }
        return mChildFragmentManager;
    }

とActivityのステイタスによってmChildFragmentManagerにライフサイクルに対応したメソッドを呼び出しています。

getActivity().getSupportFragmentManager()を子のフラグメントで直接呼び出すとライフサイクルを無視し、バックグラウンドに存在するフラグメントが表示されないというバグが発生してしまったことがわかります。

ほんきで学ぶAndroidアプリ開発入門 第2版 Android Studio、Android SDK 7対応

ほんきで学ぶAndroidアプリ開発入門 第2版 Android Studio、Android SDK 7対応