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]
私は実際にはできないadd
かreplace
、新しいものであるか、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スレッドで行われます)