0

关于这个主题有很多线程,他们的所有建议都不能解决问题。这种情况更加复杂,因为后台服务正在将数据输入到 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;
}
4

1 回答 1

0

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

于 2012-05-09T19:09:48.963 回答