AlertDialog在方向更改时崩溃

时间:2012-05-09 19:07:36

标签: android alertdialog orientation-changes

这个主题有很多主题,他们的所有建议都没有解决问题。这种情况更复杂,因为后台服务正在将数据绘制到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;
}

1 个答案:

答案 0 :(得分:0)

你能发贴你的代码吗?它可能是您附加到Dialog而不是Dialog本身的View。确保在删除视图之前不要将视图添加到对话框中(如果已连接),请从当前父级添加。