38

現在、 をFragmentActivity使用して、次のコードを使用して 2 種類のフラグメントを切り替えます。

private void toggle() {
    Fragment oldFragment = getSupportFragmentManager().findFragmentById(R.id.content);
    Fragment fragment = null;
    if (oldFragment instanceof ColorFragment) {
        fragment = new ViewPagerFragment();
    } else {
        fragment = new ColorFragment(android.R.color.black);
    }

    getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss();
}

2 つのフラグメントがトグルされています。

  • ColorFragment - 背景を黒色で塗りつぶす単純なフラグメント。
  • ViewPagerFragment - フラグメントには が含まれていますViewPager。ユーザーは、紫色のフラグメントと青色のフラグメントの間をスワイプできます。

紫と青の色の断片をスワイプするコードは次のとおりです。

private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

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

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new ColorFragment(android.R.color.holo_purple);
        default:
            return new ColorFragment(android.R.color.holo_blue_bright);
        }
    }      
} 

ただし、トグル中に奇妙な動作に遭遇します。

  1. 黒い色の断片が表示されました。
  2. トグル。
  3. ページャーを表示します。表示されている紫と青のフラグメントの間をスワイプできます。
  4. トグル。
  5. 黒い色の断片が表示されました。
  6. トグル。
  7. MyFragmentPagerAdapter の getItem がトリガーされていないため、何も表示されません。

私の状況はFragmentPagerAdapter getItem が呼び出されていないに似ていると思います

ただし、ページを切り替えるときにオーバーヘッドが増える可能性があるFragmentStatePagerAdapterため、を使用しないことを好みます。

この問題を克服するための回避策はありますか?

この問題を示すために、完全に実行可能なソース コードを含めます: https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip

4

5 に答える 5

112

この問題を解決するための回避策はありますか?

あなたのコードをダウンロードしましたが、あなたがそれらFragmentsを正しく処理していないために問題が発生します。最も正確にFragmentsは、ViewPagerベースFragmentでネストされたものを使用し、そのためにViewPager次のようにアダプターを作成します。

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getFragmentManager());

getChildFragmentManager()代わりに、ネストされたフラグメントをバインドするために使用する必要があります。

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

また、コンストラクターを介して にデータを渡すべきではありません。Fragmentそのデータは構成の変更に耐えられず、悪いことが起こり始めるからです。Bundle代わりにaを使用してください。

于 2013-03-23T16:04:58.470 に答える
2

FragmentStatePagerAdapterの代わりに簡単に使用FragmentPagerAdapter

また

あなたが使用することができますnew MyFragmentPagerAdapter(this.getChildFragmentManager())

それがあなたを助けることを願っています:)

于 2016-06-20T13:36:47.250 に答える
1

私の場合、私は正しく呼び出していました

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

しかし、ネストされたフラグメントでは、次を使用してコンテナーフラグメントを別のフラグメントに置き換えようとしていました。

getFragmentManager()

アクティビティに行って電話する必要があります

getActivity().getSupportFragmentManager();
于 2015-11-11T13:34:30.803 に答える