0

した後で次のように、このアクションを実行することはできません私のスタックトレースです:はonSaveInstanceState

Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1493) 
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511) 
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634) 
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613) 

は、これは私のコードです:

dialog = FeedDialog.getInstance(feedViewModels, this, false, this); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     if (fragmentManager != null && !isFinishing()) { 
      FragmentTransaction ft = fragmentManager.beginTransaction(); 
      ft.add(R.id.fragment_content, dialog); 
      ft.addToBackStack("unread_feeds"); 
      ft.commit(); 
      fragmentManager.executePendingTransactions(); 
     } 

ここでダイアログが表示ページャを含むフラグメントです。

この問題は1回しか発生していません。私はそれを修正する方法を教えてください。

答えて

0

IllegalStateExceptionは、不適切な時間にメソッドを呼び出すと発生します。

非常に一般的な方法は、ネットワークコールを呼び出し、コールバックでフラグメントトランザクションをトリガーする方法です。ネットワーク通話が完了したときにアプリが最小化された場合は、IllegalStateExceptionが必要です。 私はあなたが非同期コールバックでこのトランザクションを実行するべきだと思います。

解決方法は、トランザクションを実行する前にisResumed()のチェックを追加することです。 isResumed()がfalseを返す場合は、アプリが再開した後にトランザクションが発生するようにキューに入れる必要があります。フラグメント(またはBaseFragment)にRunnableオブジェクトのリストを保持し、onResumeでそれらを実行するヘルパーメソッドを持つことができます。

List<Runnable> pendingJobsOnResume; 
public void executeOnResume(Runnable runnable) { 
    if (isResumed()) { 
     runnable.run(); 
    } else { 
     pendingJobsOnResume.add(runnable); 
    } 
} 

// And invoke them in onResume 
void onResume() { 
    super.onResume(); 
    for (Runnable runnable : pendingJobsOnResume) { 
     runnable.run(); 
    } 
    pendingJobsOnResume.clear(); 
} 

は、その後、あなたのコールバックで、あなたの代わりに、直接呼び出すのexecuteOnResumeに実行可能を通じてトランザクションコードを渡すことができます。

someAsyncTask(new Callback() { 
    void call() { 
     // do common stuff. 

     executeOnResume(new Runnable() { 
      void run() { 
       // fragment transaction 
      } 
     }) 
    } 
} 
関連する問題