关于这个主题有很多线程,他们的所有建议都不能解决问题。这种情况更加复杂,因为后台服务正在将数据输入到 AlertDialog 中。该服务使用 LocalBroadcastManager 将 Intent 传递给包含 onCreateDialog 回调的主活动。数据来得很快。
我尝试在 onPause() 中调用 removeDialog,将上下文设置为 null,以便线程在 null 时不会调用它,并且在 onStart 中,我将新上下文传递给向广播接收器发出信号的线程。日志消息显示删除了被调用的对话框。更改屏幕方向后,showDialog() 方法现在触发 onCreateDialog() 回调。当该回调发出信号时,findViewById() 按预期返回 null,因为对话框已被删除(据说),但我仍然得到那个可怕的错误
“ java.lang.IllegalStateException: 指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()。 ”
(如何在 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;
}