我是 Android 新手,在我对活动生命周期的理解中似乎仍然缺少一些东西。我有一个使用FragmentActivity
. 自定义ViewPager
管理选项卡的显示,在其中一个选项卡中,我想要一个简单的向下钻取,能够使用硬件“返回”按钮返回到上一个视图的级别。
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;
}
}
这工作正常,直到我尝试改变方向。Fragment
s 成功地从该更改中返回,但是当我在该状态下尝试按“后退”按钮时,FinalResultsFragment
我得到了
IllegalStateException: Fragment already active
E/AndroidRuntime(1094): at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
为什么方向的变化会破坏代码的这个特定部分?
编辑:
因此,如果我打开应用程序,第一个选项卡处于活动状态,我按下一个按钮,在该选项卡中加载不同的片段,然后按下返回按钮 - 一切都很好,第一个片段已按预期加载。
但是如果我打开应用程序,第一个选项卡处于活动状态,我按下一个按钮,在该选项卡中加载不同的片段,旋转屏幕,片段重新加载就好了,然后按下返回按钮 - 崩溃!
编辑:
这是完整的错误日志: http: //pastebin.com/ESDTstsm