0

我是 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;
    }
 }

这工作正常,直到我尝试改变方向。Fragments 成功地从该更改中返回,但是当我在该状态下尝试按“后退”按钮时,FinalResultsFragment我得到了

IllegalStateException: Fragment already active
E/AndroidRuntime(1094):     at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)

为什么方向的变化会破坏代码的这个特定部分?

编辑:

因此,如果我打开应用程序,第一个选项卡处于活动状态,我按下一个按钮,在该选项卡中加载不同的片段,然后按下返回按钮 - 一切都很好,第一个片段已按预期加载。

但是如果我打开应用程序,第一个选项卡处于活动状态,我按下一个按钮,在该选项卡中加载不同的片段,旋转屏幕,片段重新加载就好了,然后按下返回按钮 - 崩溃!

编辑:

这是完整的错误日志: http: //pastebin.com/ESDTstsm

4

0 回答 0