web-dev-qa-db-ja.com

FragmentPagerAdapter getItemがトリガーされていません

現在、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

38
Cheok Yan Cheng

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

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

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

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

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

また、データをコンストラクター経由でFragmentに渡さないでください。そのデータは構成の変更に耐えられず、不良なものが現れ始めます。代わりにBundleを使用してください。

110
Luksprog

グローバルな作業テスト済みソリューション

getSupportFragmentManager()はnull参照を数回保持し、View pagerは新しいフラグメントインスタンスを作成しません。同じフラグメントへの参照を見つけるためです。したがって、これを克服するために、getChildFragmentManager()を使用すると、簡単な方法で問題を解決できます。

しない

new PagerAdapter(getSupportFragmentManager(), fragments);

行う

new PagerAdapter(getChildFragmentManager() , fragments);

12
Vinayak

FragmentStatePagerAdapterの代わりにFragmentPagerAdapterを使用する

または

new MyFragmentPagerAdapter(this.getChildFragmentManager())を使用できます

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

1
Neo

私の場合、私は正しく電話していました

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

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

getFragmentManager()

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

getActivity().getSupportFragmentManager();
1
kingston

私の場合、これをFragmentPagerAdapterに追加すると機能しました。

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

そして、私はgetChildFragmentManager() Luksprogが言ったように

0
Jorge Casariego