Android AlertDialog У указанного потомка уже есть родительское исключение - PullRequest
4 голосов
/ 01 ноября 2011

У меня есть небольшая проблема с 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 ]

7 голосов
/ 01 ноября 2011
.setView(input)

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

1 голос
/ 01 ноября 2011

Однажды у меня была похожая проблема. Я использовал 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 каким-то образом кэширует его и не вызывает onCreateDialog () каждый раз, когда вы вызываете showDialog (). Поэтому мое решение называлось

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

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

...