2016-12-06 22 views
1

このエラーは私の非常に大きな問題であり、私はそれを解決することはできませんが、私はいくつかの断片をアクティビティに持っており、Android onSaveInstanceState

if (mSelectedMenuItem != 2) { 
    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      transaction.replace(R.id.menu_containers, fragment); 
      transaction.commit(); 
     } 
    }, duration); 
} 

エラー:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

と私のonSaveInstanceState

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    // Bug in android version > 11 
    //super.onSaveInstanceState(outState); 
    outState.putInt("selectedMenuItem", selectedMenuItem); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    selectedMenuItem = savedInstanceState.getInt("selectedMenuItem"); 
} 
+0

この[フラグのトランザクションとアクティビティの状態の損失](http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html)を確認してください。 – Raghavendra

答えて

1

ますpostDelayed()を使用して問題を尋ねています。これが実行される前に、アプリケーションが殺されることができます

new Handler().postDelayed(new Runnable() { 

使用が、最後の手段としてのみcommitAllowingStateLoss()は(IllegalStateExceptionがエラーを回避するために)使用することができます。 commit()commitAllowingStateLoss()を呼び出す間の唯一の違いは、状態の損失が発生した場合、後者は例外をスローしないことです。通常、このメソッドを使用したくないのは、状態の損失が発生する可能性があることを意味するためです。もちろん、より良い解決策は、アクティビティの状態が保存される前にcommit()が呼び出されることが保証されるようにアプリケーションを作成することです。これによりユーザーエクスペリエンスが向上します。状態の損失の可能性を避けることができない限り、commitAllowingStateLoss()は使用しないでください。

関連する問題