【问题标题】:Getting exception as Failure saving state: active Fragment has cleared index: -1 when I am pressing home button of android device将异常作为失败保存状态:活动片段已清除索引:-1 当我按下 android 设备的主页按钮时
【发布时间】:2014-05-13 12:39:15
【问题描述】:

当我按下 android 的主页按钮并开始新活动时,我遇到了一些奇怪的问题。

我的堆栈跟踪如下

05-13 18:06:21.182: E/FragmentManager(5674): Failure saving state: active Fragment{411d96d8} has cleared index: -1
05-13 18:06:21.182: E/FragmentManager(5674): Activity state:
05-13 18:06:22.032: E/ACRA(5674): ACRA caught a IllegalStateException exception for com.itgurussoftware.android.dineback. Building report.
05-13 18:06:27.732: E/ACRA(5674): com.itgurussoftware.android.dineback fatal error : Failure saving state: active Fragment{411d96d8} has cleared index: -1
05-13 18:06:27.732: E/ACRA(5674): java.lang.IllegalStateException: Failure saving state: active Fragment{411d96d8} has cleared index: -1
05-13 18:06:27.732: E/ACRA(5674):   at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1723)
05-13 18:06:27.732: E/ACRA(5674):   at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:546)
05-13 18:06:27.732: E/ACRA(5674):   at android.app.Activity.performSaveInstanceState(Activity.java:1113)
05-13 18:06:27.732: E/ACRA(5674):   at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1185)
05-13 18:06:27.732: E/ACRA(5674):   at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:2793)
05-13 18:06:27.732: E/ACRA(5674):   at android.app.ActivityThread.handleStopActivity(ActivityThread.java:2851)
05-13 18:06:27.732: E/ACRA(5674):   at android.app.ActivityThread.access$900(ActivityThread.java:123)
05-13 18:06:27.732: E/ACRA(5674):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1164)
05-13 18:06:27.732: E/ACRA(5674):   at android.os.Handler.dispatchMessage(Handler.java:99)
05-13 18:06:27.732: E/ACRA(5674):   at android.os.Looper.loop(Looper.java:137)
05-13 18:06:27.732: E/ACRA(5674):   at android.app.ActivityThread.main(ActivityThread.java:4424)
05-13 18:06:27.732: E/ACRA(5674):   at java.lang.reflect.Method.invokeNative(Native Method)
05-13 18:06:27.732: E/ACRA(5674):   at java.lang.reflect.Method.invoke(Method.java:511)
05-13 18:06:27.732: E/ACRA(5674):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-13 18:06:27.732: E/ACRA(5674):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-13 18:06:27.732: E/ACRA(5674):   at dalvik.system.NativeStart.main(Native Method)

我添加和删除片段的代码如下

        FragmentContainer fragContainer = container.get(container.size() - 1);
        Fragment fragment = fragContainer.getFragment();
        String tag = fragContainer.getTabName();
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();

        mTabHost.setCurrentTabByTag(tag);

        if (!fragment.isAdded()) {

            ft.remove(fragment);
        }
        if(container.size()>0)
            container.remove(container.size() - 1);
        ft.replace(R.id.realtabcontent, fragment);
        ft.commitAllowingStateLoss();

试过

  • 更新支持库
  • 尝试将 onSaveInstanceState 覆盖为

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        if (outState != null) {
            super.onSaveInstanceState(outState);
        }
    }
    

【问题讨论】:

  • 您有此问题的任何具体原因:if (fragment.isAdded()) { ft.remove(fragment); }。我建议删除它。如果已添加片段,ft.replace(R.id.realtabcontent, fragment); 将负责删除它。当您删除并重新添加相同的片段时,将引发报告的异常。它在replace 方法中得到修复,该方法基本上不执行任何操作。检查这个commit message
  • 好的,根据您的评论,我删除了该代码并尝试了,但问题仍然存在。
  • 你为什么用commitAllowingStateLoss()而不是commit()
  • 你找到确切的原因了吗?
  • 你在使用setRetainInstance(true)吗?对于我用作任务容器来管理 Google+ API 事物的无头片段,我一直在收到此错误,并且我正在使用 setRetainInstance(true) 并在快节奏的点击测试中遇到此错误(是猴子测试吗?)。删除此呼叫后,我已停止收到错误消息。遗憾的是,我无法具体说明为什么会这样。

标签: android android-fragments android-fragmentactivity


【解决方案1】:
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState, this, TAG_TAFFER_TIME);
    mFragmentHolder = (RelativeLayout) findViewById(R.id.fragment);
    mFragmentTransaction = getSupportFragmentManager().beginTransaction();
    mFragmentTransaction.add(mFragmentHolder.getId(), mFragmentTafferTime, TAG);
    mFragmentTransaction.addToBackStack(TAG);
    mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    mFragmentTransaction.commit();
  } 

// On fragment change try to use this function
private void changeFragment(SherlockFragment fragment, String tag) {
    try {
        mFragmentTransaction.replace(mFragmentHolder.getId(), fragment, tag);
        mFragmentTransaction.addToBackStack(tag);
        mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        mFragmentTransaction.commit();
    } catch (Exception exception) {

    }
}

【讨论】:

    【解决方案2】:

    就我而言,我做到了。

          @Override
          public void onDestroyView() {
            super.onDestroyView();
             if (mActivity.getSupportFragmentManager() != null && mAlbumFragment != null && 
                 mAlbumFragment.isAdded()) {
                 FragmentTransaction trans = 
                 mActivity.getSupportFragmentManager().beginTransaction();
                 trans.remove(mAlbumFragment).commitAllowingStateLoss();
            }
        }
    

    我还将FragmentTransaction.add() 替换为FragmentTransaction.replace()。 如果你使用的是单个片段,你可以试试这个。我认为这样做可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多