Android AlertDialog指定的子级已有父Exception

时间:2011-11-01 10:45:09

标签: android android-alertdialog

我的申请表上有AlertDialog的问题。我正在显示AlertDialog,因此用户可以更改他刚刚按下的按钮的文本。当我第一次这样做时没有问题,但是如果我再次按下按钮,我的应用程序会崩溃并出现标题中的异常。这是我正在使用的代码:

public void createDialog(){
     new AlertDialog.Builder(Settings.this)
    .setTitle("Stampii Server Name")
    .setView(input)
    .setPositiveButton("Set Name", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            String serverName = input.getText().toString();
            server.setText(serverName);
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    }).show();
}


server.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        createDialog();
    }
});

任何想法如何解决这个问题?我看过类似的问题,但找不到合适的解决方案。

提前致谢!

2 个答案:

答案 0 :(得分:7)

.setView(input)

变量“input”未在方法中创建,并且每次都被添加到新对话框中。这意味着,每次调用create方法时,都会尝试将新父项添加到同一对象中。每次创建对话框时都需要一个新的“输入”,或者您可以一遍又一遍地使用相同的对话框。

答案 1 :(得分:1)

我有一次类似的问题。我正在使用showDialog(int id,Bundle args)并实现了

protected Dialog onCreateDialog(int id,Bundle args)
{
    switch(id)
    {
    case ...:
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setPositive...
        return builder.create();
    }
}

我的错误是我必须在创建新对话框之前使用removeDialog(int id),因为Android以某种方式缓存对话框,并且每次调用showDialog()时都不会调用onCreateDialog()。 所以我的解决方案是调用

removeDialog(id);
showDialog(id,args);

并通过在switch语句之前删除所有可能的对话框来修改onCreateDialog(),以避免与任何其他缓存对话框冲突。