私は Android を初めて使用しますが、アクティビティのライフサイクルを理解するにはまだいくつかのことが欠けているようです。で作成されたタブ付きアプリケーションがありFragmentActivity
ます。カスタムViewPager
はタブの表示を管理しており、それらのタブの 1 つで、ハードウェアの「戻る」ボタンを使用して前のビューにレベルを戻す機能を備えた単純なドリルダウンが必要です。
このドリルダウンを実装するには、フラグの値をチェックしてタブに適切な値を代入するだけFragment
です (これにより、ドリルダウンのどこにいるかが決まります)。
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
@Override
public Fragment getItem(int position) {
Fragment fragment;
switch (position) {
case 0 :
if (stateFlag == 0) fragment = (Fragment) new InitialFragment();
else fragment = (Fragment) new FinalResultsFragment();
break;
case 1:
fragment = (Fragment) new SecondTabFragment();
break;
default:
fragment = (Fragment) new ThirdTabFragment();
break;
}
return fragment;
}
「前の」フラグメントに戻るには、次のようにします。
@Override
public void onBackPressed() {
int p = mViewPager.getCurrentItem();
switch (p) {
case 0:
if (stateFlag == 0)) {
super.onBackPressed();
} else {
stateFlag = 0;
mViewPager.getAdapter().notifyDataSetChanged();
mViewPager.setCurrentItem(0);
}
break;
default:
super.onBackPressed();
break;
}
}
向きを変えようとするまで、これはうまくいきます。その変更から s が正常に戻るのですが、その状態でFragment
戻るボタンを押してみると、FinalResultsFragment
IllegalStateException: Fragment already active
E/AndroidRuntime(1094): at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
方向の変更によって、コードのこの特定の部分が壊れるのはなぜですか?
編集:
したがって、最初のタブをアクティブにしてアプリを開くと、そのタブに別のフラグメントをロードするボタンを押してから、[戻る] ボタンを押します。問題なく、最初のフラグメントがロードされます。期待どおりです。
しかし、アプリを開くと、最初のタブがアクティブになり、そのタブに別のフラグメントをロードするボタンを押すと、画面が回転し、フラグメントが正常に再ロードされ、[戻る] ボタンを押すとクラッシュします!
編集:
ここに完全なエラー ログがあります: http://pastebin.com/ESDTstsm