2016-12-06 1 views
1

이 오류는 내 매우 큰 문제이며 나는 그것에 대해 더 많은 해결책을 읽을 수 있지만이 문제를 해결할 수 없습니다 후이 작업을 수행 할 수 없습니다. 일부 활동 조각 및이 코드로 조각을 바꿉니다 :안드로이드 onSaveInstanceState

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

onSaveInstanceState :

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

@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()을 호출하는 유일한 차이점은 상태 손실이 발생하면 후자가 예외를 throw하지 않는다는 것입니다. 일반적으로 상태 손실이 발생할 가능성이 있음을 의미하기 때문에이 방법을 사용하지 않으려합니다. 물론 더 나은 솔루션은 액티비티의 상태가 저장되기 전에 commit()이 호출되도록 보장하여 더 나은 사용자 경험을 제공 할 수 있도록 애플리케이션을 작성하는 것입니다. 상태 손실의 가능성을 피할 수 없다면 commitAllowingStateLoss()을 사용하지 않아야합니다.

관련 문제