31

私は、次のようViewPagerFragmentsを含む Android アプリケーションに取り組んでいます。

MainActivity( MainActivityFragment( screenSlideViewPager( Fragments)))、つまり:

Activity 含む Fragment 含むViewPager 含む Fragment

今私の問題は、デバイスを回転させるか、画面の回転を変更すると、ViewPager のすべてのフラグメントが消えることです。

この問題を解決するためのアイデアはありますか?

編集1

MainActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getSupportFragmentManager().findFragmentByTag(TAG) == null) {
        final FragmentTransaction ft = getSupportFragmentManager()
                .beginTransaction();
        ft.add(android.R.id.content, new MainActivityFragment(), TAG);
        ft.commit();
    }
}

MainActivityFragment.java:

public class MainActivityFragment extends Fragment {
    private ViewPager mPager = null;
    private PagerAdapter mPageAdapter = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View reVal = inflater.inflate(R.layout.activity_main, container, false);
        mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent);
        mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getFragmentManager());
        mPager.setAdapter(mPageAdapter);
        return reVal;
    }

    private MainGridViewFragment mainGridFragment;
    private AlphabetGridViewFragment alphabetGridFragment;

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public android.app.Fragment getItem(int position) {
            switch (position) {
                case 1:
                    mainGridFragment = new MainGridViewFragment();
                    return mainGridFragment;
                case 0:
                    alphabetGridFragment = new AlphabetGridViewFragment();
                    return alphabetGridFragment;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
}

編集2 画面回転後のアクティビティ

明らかにMainActivityMainActivityFragmentが読み込まれ、プルーフは The です。これActionBarも読み込まれていることに注意してViewPagerください。ページ間を移動することはできますが (青いライトはページャーが最後のページに到達したことを意味します)、そのコンテンツは表示されません。

4

8 に答える 8

20

フラグメントが getFragmentManager() を使用しているときに、メイン アクティビティが getSupportFragmentManager() を使用しているようです。

これが回答投稿に値するかどうかはわかりませんが、私の評価が低すぎて他の方法で返信できません. :)

編集: FragmentActivity をサポート ライブラリで拡張する必要があるかもしれないと思います。

参照: https://stackoverflow.com/a/10609839/2640693

編集2:

public class MainActivityFragment extends FragmentActivity {
    private ViewPager mPager = null;
    private PagerAdapter mPageAdapter = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View reVal = inflater.inflate(R.layout.activity_main, container, false);
        mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent);
        mPageAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager());
        mPager.setAdapter(mPageAdapter);
        return reVal;
    }

    private MainGridViewFragment mainGridFragment;
    private AlphabetGridViewFragment alphabetGridFragment;

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 1:
                    mainGridFragment = new MainGridViewFragment();
                    return (Fragment)mainGridFragment;
                case 0:
                    alphabetGridFragment = new AlphabetGridViewFragment();
                    return (Fragment)alphabetGridFragment;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
}
于 2013-08-06T09:41:35.497 に答える
9

私は多くの解決策を試しましたが、どれでも成功しました。最後に、以下のように修正しました。

  • getChildFragmentManager() ではなく getActivity().getSupportFragmentManager() を使用してください

  • 以下のように ViewPagerAdapter クラスの getItemId(int position) メソッドをオーバーライドします。

    @Override
    public long getItemId(int position) {
        return System.currentTimeMillis();
    }
    

私にとっては魅力のように機能しています。ここにあなたの意見もコメントしてください。

于 2016-10-14T08:51:56.443 に答える
5

これに問題がある人は、これを試すことができます:

private void InitializeUI(){
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);

}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.activity_exame2);
InitializeUI();
}

私はこの問題に2日間費やしましたが、これが私にとって唯一うまくいったことでした。マニフェストのアクティビティに android:configChanges="screenSize|orientation" を追加することを忘れないでください

于 2016-08-18T21:22:52.067 に答える
3

私はこれとまったく同じ問題を抱えていました。非常に紛らわしいですが、このスレッドは、答えがなぜ機能するのかを実際に説明していないことを除いて、私を助けてくれました.

この問題を解決するには、 を使用しますFragment.getChildFragmentManager()。非常に紛らわしいのは、Android APIActivity.getFragmentManager()に があることですが、古いデバイスをサポートしようとしている場合は、 を使用する必要がありますActivity.getSupportFragmentManager()。ただし、この特定の問題は古い API のサポートに関するものではありません。

問題は、いくつかのフラグメントを所有する ViewPager を所有するフラグメントを持つアクティビティがあることです。フラグメント内にフラグメントがあります! Fragments の元の設計では、このユース ケースを実際には処理できませんでしたが、後でそれを処理するように更新されました。フラグメント内にフラグメントがある場合は、次を使用する必要があります。

Fragment.getChildFragmentManager()

a 内から、vsのを返すものと、内の sを適切にスコープするthisの を返すものをFragment選択できます。Fragment.getFragmentManager()FragmentManagerActivityFragment.getChildFragmentManager()FragmentManagerFragmentFragmentFragment

于 2016-06-25T13:16:42.170 に答える
3

ビューページャーを再度作成することは避けてください。onCreate() に onCreateView のコードを入れます。そして、フラグメントに onRetainInstance(true) を使用させます。したがって、これはフラグメントを再作成しません。ビューは onCreate() にあるため、再度呼び出されることはありません。

ビューが存在するかどうかを onCreateView() で確認し、存在する場合は削除します。切れ端:

//creates the view
private View createView(Bundle savedInstanceState) {
    View view = getActivity().getLayoutInflater().inflate(your_layout, null, false);

    //viewpager

    return view;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //retains fragment instance across Activity re-creation
    setRetainInstance(true);

    viewRoot = createView(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    if (viewRoot != null && viewRoot.getParent() != null) {
        ViewGroup parent = (ViewGroup) viewRoot.getParent();
        parent.removeView(viewRoot);

        Log.i("Test", "**************view.getParent(): " + viewRoot.getParent() + "    " + viewRoot);
    }

    return viewRoot;
}
于 2013-08-06T10:39:21.063 に答える