2016-12-06 52 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

選中此項[Fragment Transactions&Activity State Loss](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()

相關問題