28

FragmentStatePagerAdapter を使用するアクティビティの onResume() で、いくつかのケースでこれを取得しています。デバイスの戻るボタンを使用する場合。常にではない。再現できません。

サポート パッケージ v4、最終リビジョン (8) を使用しています。

すでにグーグルで検索していますが、有用な答えを見つけることに成功していません。

ソースを見ると、ここにスローされています: FragmentManager.java

@Override
public void putFragment(Bundle bundle, String key, Fragment fragment) {
    if (fragment.mIndex < 0) {
        throw new IllegalStateException("Fragment " + fragment
                + " is not currently in the FragmentManager");
    }
    bundle.putInt(key, fragment.mIndex);
}

しかし、フラグメントのインデックス < 0 があるのはなぜですか?

フラグメントをインスタンス化するコード:

@Override
public Fragment getItem(int position) {
    Fragment fragment = null;

    switch(position) {
        case 0:
            fragment = MyFragment.newInstance(param1);
            break;
        case 1:
            fragment = MyFragment2.newInstance(param2, param3);
            break;
    }
    return fragment;
}

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

7 に答える 7

10

ここでも同じエラーが発生しましたが、別の理由でした。

私の場合、FragmentStatePagerAdapter で getItemPosition をオーバーライドしました。私のアイデアは、アイテムが存在する場合は位置を返し、存在しなくなった場合は POSITION_NONE を返すことでした。

さて、私の問題は、コレクションが空になったときに POSITION_NONE を返したことです。そして、それはすべてを壊しました。

私の修正は、空のコレクションがあるときに POSITION_UNCHANGED を返すことでした。

それが他の誰かに役立つことを願っています。

于 2013-12-22T21:04:00.807 に答える
8

バグを理解するための 2 つの重要な点は次のとおりです。

  1. それは時々起こります。
  2. で起こりonResume()ます。

この情報を考えると、ViewPagerが の状態を保持していない可能性がありますFragmentFragmentから直接 を操作してActivityいる場合、オフページFragmentが破棄され、フラグメントActivityを操作しようとしている可能性があります。現在の画面にない場合でも の状態nullを保持するには、修正は非常に簡単です。Fragment

private static final int NUM_ITEMS = 2;

ViewPager mPager = /** instantiate viewpager **/;
mPager.setOffscreenPageLimit(NUM_ITEMS-1);

ここでそれについて読むことができます:

ViewPager フラグメントは時間の経過とともに破壊されますか?

于 2012-07-02T15:24:40.800 に答える
5

その理由は、onResume() で毎回アダプターをインスタンス化しているからです。

アクティビティのライフ サイクルでアダプタを 1 回だけインスタンス化すると、これは発生しなくなります。

于 2012-07-02T15:30:06.730 に答える
2

私の場合、その理由は別のものでした。

Loader.onLoaderReset()の場合、アダプターからデータを消去しました。アプリを離れると、onDestroy() によってローダーがリセットされ、FragmentStatePagerAdapter. アダプターがフラグメントへのすべての参照をクリアしたと思いますが、どういうわけか、FragmentManager気づかずに例外をスローしました。私にはあまり論理的ではないようです。

私にとってそれが起こったことに注意してくださいActivity.onDestroy()

それが誰かを助けることを願っています。

于 2013-06-24T16:48:28.027 に答える
0

ViewPager のフラグメントが修正されました。アダプターのフラグメントを置き換えるのではなく、フラグメントの別のセットを指定して notifyDataSet を変更するか、FrameLayout を利用して、ビュー ページャー タブの現在のフラグメントの上に別のフラグメントを表示します。

動作する私のソリューションがあります:

デフォルトのスワイプが無効になっている ViewPager とともにフラグメント レベルで適用されるスワイプ ジェスチャ

于 2013-11-20T12:42:04.497 に答える