2017-03-16 4 views
1

アクティビティ内に、CounterActivityと呼ばれるカウンタがあります。次のようにカウンタが0になったときDialogFramentが示されている:アクティビティが画面に表示されていないときにDialogFragmentが例外をスローする

MessageFragment dialog = new MessageFragment(); 
dialog.show(getSupportFragmentManager(), "MessageFragment"); 

その活動の主なレイアウトがandroid:keepScreenOn="true"、スクリーンがあれば活動が表示されているようにタイムアウトしないという方法を設定し、次の属性を有します。別のアプリケーションを開くと、CounterActivityでonStopが呼び出されます。まだバックグラウンドで実行されているカウンタは、DialogFragmentを示すのではなく、に0を取得した場合、次の例外がスローされます。

あなたの活動は、UI上の理由から、画面上にないときは、フラグメント取引を行うことはできません
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
+0

他のスレッドが終了してから何かをする前に、あなたのアクティビティがまだ利用可能かどうかを最初に確認する必要があります。コンテキストでヌルチェックを行うことができます。 –

答えて

0

(あなたアクティビティが強制終了され、復元されるため、UIの変更は再び行われません)。

したがって、アクティビティがアクティブでない場合は、UIを変更しないでください。あなたは、問題を処理するための複数のソリューションを持っている: 1-あなたは単に、あなたの「ます。public void onResume()」をオーバーライドし、ブール「showDialogOnResume」を登録することができます

@Override 
public void onResume() { 
    super.onResume(); 
    if(showDialogOnResume) { 
     /*build your dialog here*/ 
     dialog.show(getSupportFragmentManager(), "MessageFragment"); 
    } 
} 

あなたが活動にこれをやっている場合は(ありませんでフラグメント)代わりに "onPostResume()"をオーバーライドすることをお勧めします。 this postと特にjedの回答とpjvのコメントを見てください。

それも、あなたが呼び出しされていないことが起こる可能性がありますあなたの "onActivityResult()" で

super.onActivityResult(); 

。 Sufianがjed答えに対する彼のコメントで言ったように。

基本的に、アクティビティのライフサイクル中にUIが変更されないようにしてください。あなたの活動が活動しているときだけそれを許可してください。それを行うことができない場合(AsyncTasksのような他のスレッド)、答えを得て、何とか保存して、あなたの活動結果を変更してください。ユーザーがアクティビティを再開しない場合は、変更する必要はありません。

関連する問題