0

3つのフラグメントを持つViewPagerとFragmentPagerAdapterがあります。

private class test_pager extends FragmentPagerAdapter {
    public test_pager(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        return fragments[i];
    }

    @Override
    public long getItemId(int position) {
        if (position == 1) {
            long res = fragments[position].hashCode()+fragment1_state.hashCode();
            Log.d(TAG, "getItemId for position 1: "+res);
            return res;
        } else
            return fragments[position].hashCode();
    }

    @Override
    public int getCount() {
        return fragments[2] == null ? 2 : 3;
    }

    @Override
    public int getItemPosition(Object object) {
        Fragment fragment = (Fragment) object;
        for (int i=0; i<3; i++)
            if (fragment.equals(fragments[i])){
                if (i==1) {
                    return 1; // not sure if that makes a difference
                }
                return POSITION_UNCHANGED;
            }

        return POSITION_NONE;
    }
}

あるページ(#1)で、表示するフラグメントを変更し続けています。古いフラグメントを削除する方法は次のとおりです。

FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().remove(old_fragment1).commit();

そして、値を変更するだけですfragments[1]

私は実際にはできないaddreplace、新しいものであるか、ViewPagerが別のタグでそれを追加しようとしていると文句を言うでしょう...(私はここで何か間違ったことをしていますか?)

私が表示するすべてのフラグメントはsetRetainInstance(true);、それらのonCreate機能に含まれています。

私の問題は、これは通常最初の数回の置換でうまく機能することですが、フラグメントを再利用しようとすると、時々(パターンを実際に理解していないため、これが発生する前に同じフラグメントが数回表示される可能性があります)、空白のページを表示します。

問題が発生したときに表示しようとしているフラグメントのコールバック関数で発生したことがわかりました。

  • onAttachが呼び出されます(ただし、その時点では、getViewはまだnullです)
  • onCreateView呼び出されません(それは予想されます)
  • onViewStateRestored呼ばれていません(なぜですか?)
  • onResume呼ばれていません(私は本当にそうなると思いました...)

それが何かを変えるなら、私はサポートパッケージを使用しています、私の活動はSherlockFragmentActivity

編集(マルコのコメントに答えるために):

フラグメントは、アクティビティのonCreate関数でインスタンス化されます。これらのフラグメントをArrayListに入力します。

char_tests = new ArrayList<Fragment>(Arrays.asList(
            new FragmentOptionA(), new FragmentOptionB(), new FragmentOptionC()));

そのリストから選択して設定しますfragments[1](これはすべてUIスレッドで行われます)

4

1 に答える 1

0

代わりにFragmentStatePagerAdapterを拡張するようにtest_pagerを変更することで、これを修正しました。

PagerAdapter使い方によっては何を使うべきかまだ迷っています。ドキュメントで私が見つけることができる唯一のことはFragmentPagerAdapter、メモリに保持されるページ数が少ない場合に適していることとFragmentPagerStateAdapter、ページが破棄されてメモリを節約するページ数が多い場合に適していることです...

フラグメントを使って(派手な?)何かをしようとするとFragmentStatePagerAdapter、この場合のようにページを削除して再挿入した方が良いことがわかりました。また、FragmentPagerAdapterは、ページが位置を移動するときに優れています(バグ37990を参照) 。

于 2012-11-28T03:13:07.920 に答える