Android AlertDialog Указанный дочерний элемент уже имеет родительское исключение

#android #android-alertdialog

#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();
    }
});
 

Есть идеи, как я могу решить эту проблему? Я рассмотрел вопросы, подобные этому, но не могу найти рабочего решения.

Заранее спасибо!

Комментарии:

1. Проверьте, в какой строке происходит сбой в методе CreateDialog..

Ответ №1:

 .setView(input)
 

Переменная «input» не создается в методе и каждый раз добавляется в новое диалоговое окно. Это означает, что каждый раз, когда вы вызываете свой метод create, вы пытаетесь добавить нового родителя к тому же объекту. Вам потребуется новый «ввод» каждый раз, когда вы создаете диалоговое окно, или вы можете использовать одно и то же диалоговое окно снова и снова.

Комментарии:

1. Я забыл о EditText . Большое спасибо!

2. Нет проблем. Я рад помочь.

Ответ №2:

Однажды у меня была похожая проблема. Я использовал ShowDialog (идентификатор int, аргументы пакета) и реализовал

 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 каким-то образом кэширует диалоговое окно и не вызывает onCreateDialog() каждый раз, когда вы вызываете ShowDialog() .
Итак, мое решение вызывало

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

и изменение onCreateDialog() путем удаления всех возможных диалоговых окон перед оператором switch, чтобы избежать конфликтов с любым другим кэшированным диалогом.