このトピックには非常に多くのスレッドがあり、すべての提案が問題を解決するわけではありません。バックグラウンド サービスが AlertDialog にグラフ化されたデータをフィードしているため、この状況はより複雑になります。サービスは、LocalBroadcastManager を使用して、onCreateDialog コールバックを含むメイン アクティビティに Intent を渡します。データは非常に迅速に届きます。
onPause() で removeDialog を呼び出してみました。コンテキストを null に設定して、スレッドが null のときに呼び出しないようにし、onStart で新しいコンテキストをブロードキャスト レシーバーに通知するスレッドに渡します。ログ メッセージは、呼び出されるダイアログの削除を示します。画面の向きが変更された後、showDialog() メソッドが onCreateDialog() コールバックをトリガーするようになりました。そのコールバックが通知されると、ダイアログが(おそらく)削除されているため、findViewById()は期待どおりにnullを返しますが、それでも恐ろしいエラーが発生します
" java.lang.IllegalStateException: 指定された子にはすでに親があります。最初に子の親で removeView() を呼び出す必要があります。 "
(AlertDialog で 'removeView' を呼び出す方法も、私が答えを見つけることができないものであり、このフォーラムの他の誰もそれに対する答えを見つけていません!)
私が考えることができる唯一のことは、間違ったコンテキストを持つ Broadcast イベントがキューに入れられているということです。おそらく、ブロードキャスト レシーバーに向かうすべてのインテントをクリアする方法はありますか?
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;
}