現在、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フラグメントが切り替えられています。
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);
}
}
}
しかし、トグル中に奇妙な動作に遭遇します。
私の状況は FragmentPagerAdapter getItemが呼び出されない に似ていると思います
ただし、ページ間を切り替える際のオーバーヘッドの可能性が高いため、FragmentStatePagerAdapter
を使用しないことを好みます。
この問題を克服するための回避策はありますか?
この問題を実証するための完全な実行可能なソースコードを含めます。 https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.Zip
この問題を克服するための回避策はありますか?
あなたのコードをダウンロードしましたが、これらのFragments
を正しく処理しないため、問題が発生します。最も正確には、Fragments
ベースのViewPager
でネストされたFragment
を使用し、そのViewPager
に対して次のようなアダプターを作成します。
_MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getFragmentManager());
_
代わりに、getChildFragmentManager()
を使用して、ネストされたフラグメントをバインドする必要があります。
_MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());
_
また、データをコンストラクター経由でFragment
に渡さないでください。そのデータは構成の変更に耐えられず、不良なものが現れ始めます。代わりにBundle
を使用してください。
グローバルな作業テスト済みソリューション
getSupportFragmentManager()
はnull参照を数回保持し、View pagerは新しいフラグメントインスタンスを作成しません。同じフラグメントへの参照を見つけるためです。したがって、これを克服するために、getChildFragmentManager()
を使用すると、簡単な方法で問題を解決できます。
しない
new PagerAdapter(getSupportFragmentManager(), fragments);
行う
new PagerAdapter(getChildFragmentManager() , fragments);
FragmentStatePagerAdapter
の代わりにFragmentPagerAdapter
を使用する
または
new MyFragmentPagerAdapter(this.getChildFragmentManager())
を使用できます
それがあなたを助けることを願っています:)
私の場合、私は正しく電話していました
MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());
しかし、ネストされたフラグメントでは、次を使用してコンテナフラグメントを別のものに置き換えようとしました:
getFragmentManager()
アクティビティに行って電話する必要があります
getActivity().getSupportFragmentManager();
私の場合、これをFragmentPagerAdapterに追加すると機能しました。
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
そして、私はgetChildFragmentManager() Luksprogが言ったように