このトピックにはスレッドが非常に多く、そのすべての提案は問題を解決しません。この状況は、バックグラウンドサービスがAlertDialogにグラフ化されたデータを供給しているため、より複雑になります。このサービスは、LocalBroadcastManagerを使用して、onCreateDialogコールバックを含むメインアクティビティにインテントを渡します。データはかなり早く来ています。方向変更時にAlertDialogがクラッシュする
私はonPause()でremoveDialogを呼び出し、ヌルにコンテキストを設定するようにコンテキストを設定しようとしましたが、onStartではブロードキャストレシーバを通知するスレッドに新しいコンテキストを渡します。ログメッセージは、呼び出されたダイアログの削除を示します。画面の方向が変更された後、showDialog()メソッドがonCreateDialog()コールバックをトリガーするようになりました。そのコールバックが通知されると、ダイアログが削除されているので、findViewById()はnullを返しますが、まだ恐ろしいエラーが返されます。
"java.lang.IllegalStateException:指定された子にはすでに親があります。 "
(AlertDialogでの 'removeView'の呼び出し方法は、私が答えを見つけることができないもので、このフォーラムの他の誰も答えを見つけられませんでした。そのどちらか!)
私が考えることができるのは、ブロードキャストイベントが間違ったコンテキストを持つキューに入れられていることだけです。おそらく、放送受信機に向かうすべてのインテントをクリアする方法がありますか?
ここにonCreateDialogのコードを示します。グラフィック表示は 'waveForm.get(id)'にあります。それはうまく動作し、グラフを表示します(私が望むように連続的ではありませんが)。
protected Dialog onCreateDialog(int id)
{
Log.d(TAG, "Alert Dialog 'onCreateDialog' method has been called with id " + id);
if(this.findViewById(id) != null)
{
Log.d(TAG, "Alert Dialog view exists!");
return null;
}
switch(id)
{
case 0:
Builder bldr = new AlertDialog.Builder(this);
Dialog alert = bldr.setView(waveForm.get(id)).setNegativeButton("Dismiss " + id,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
dialog.cancel();
}
}).create();
alert.getWindow().setLayout(LayoutParams.WRAP_CONTENT, waveForm.get(id).getCurrentHeight());
return alert;
case 1:
Builder bldr1 = new AlertDialog.Builder(this);
Dialog alert1 = bldr1.setView(waveForm.get(id)).setNegativeButton("Dismiss " + id,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
dialog.cancel();
}
}).create();
alert1.getWindow().setLayout(LayoutParams.WRAP_CONTENT, waveForm.get(id).getCurrentHeight());
return alert1;
case 2:
Builder bldr2 = new AlertDialog.Builder(this);
Dialog alert2 = bldr2.setView(waveForm.get(id)).setNegativeButton("Dismiss " + id,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
dialog.cancel();
}
}).create();
alert2.getWindow().setLayout(LayoutParams.WRAP_CONTENT, waveForm.get(id).getCurrentHeight());
return alert2;
}
return null;
}
私はonCreateDialogコードを追加しました。ビューが添付されるように、画面の向きを変更するまで機能します。私は3つのダイアログをすべて稼働させて稼働させますが、1つは別のダイアログの上に表示します。 –