Как отключить кнопку внутри AlertDialog?

Я пытаюсь написать AlertDialog с 3 кнопками. Я хочу, чтобы средняя нейтральная кнопка была отключена, если не выполняется определенное условие.

Код

int playerint = settings.getPlayerInt();
int monsterint = settings.getMonsterInt();



        AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
        alertbox.setMessage("You have Encountered a Monster");

        alertbox.setPositiveButton("Fight!",
                new DialogInterface.OnClickListener() {

                    // do something when the button is clicked
                    public void onClick(DialogInterface arg0, int arg1) {
                        createMonster();
                        fight();

                    }
                });

        alertbox.setNeutralButton("Try to Outwit",
                new DialogInterface.OnClickListener() {

                    // do something when the button is clicked
                    public void onClick(DialogInterface arg0, int arg1) {
                        // This should not be static
//                      createTrivia();
                        trivia();

                    }
                });

        // Return to Last Saved CheckPoint
        alertbox.setNegativeButton("Run Away!",
                new DialogInterface.OnClickListener() {

                    // do something when the button is clicked
                    public void onClick(DialogInterface arg0, int arg1) {
                        runAway();
                    }
                });

        // show the alert box
        alertbox.show();

// Intellect Check

Button button = ((AlertDialog) alertbox).getButton(AlertDialog.BUTTON_NEUTRAL);

        if(monsterint > playerint) {


            button.setEnabled(false);

        }
    }

Линия:

Button button = ((AlertDialog) alertbox).getButton(AlertDialog.BUTTON_NEUTRAL);

Выдает ошибку:

Невозможно преобразовать AlertDialog.Builder в AlertDialog.

Как это исправить?


person Frank Bozzo    schedule 12.09.2011    source источник
comment
Это не сработает для версии 2.3.3. В этой версии getButton всегда возвращает null.   -  person barwnikk    schedule 04.12.2012


Ответы (3)


Вы не можете звонить getButton() на AlertDialog.Builder. Его нужно вызвать для полученного AlertDialog после создания. Другими словами

AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
//...All your code to set up the buttons initially

AlertDialog dialog = alertbox.create();
Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
if(monsterint > playerint) {
    button.setEnabled(false);
}

Построитель - это просто класс, облегчающий построение диалога... это не сам диалог.

ХТН

person devunwired    schedule 12.09.2011
comment
stackoverflow.com/questions/7403040/ - person Frank Bozzo; 13.09.2011
comment
Сначала я попробовал этот подход самостоятельно, но возврат от dialog.getButton() был нулевым, поэтому я получил исключение нулевого указателя. Я не уверен, что это работает больше. - person BeccaP; 10.03.2016
comment
Вы не можете вызвать setEnabled, если не отображается диалоговое окно. - person Eric Smith; 27.04.2021

Лучшее решение, на мой взгляд:

AlertDialog.Builder builder = new AlertDialog.Builder(context); 
builder.setPositiveButton("Positive", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // some code
    }
});
AlertDialog alertDialog = builder.create();
alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                if(**some condition**)
                {
                    Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
                    if (button != null) {
                        button.setEnabled(false);
                    }
                }
            }
        });
person Michal    schedule 04.11.2013
comment
Этот ответ должен быть устаревшим. Я не вижу setOnShowListener в документе для AlertDialog.Builder. (developer.android.com/reference/android/app/) - person Al Lelopath; 08.07.2015
comment
Я думаю, что ошибся, setOnShowListener() доступен в самом классе AlerDialog. я отредактирую свой ответ - person Michal; 17.08.2015
comment
Здесь alertDialog должен быть окончательным, чтобы он был действителен при использовании в onShow(). - person BeccaP; 10.03.2016

Хитрость в том, что вам нужно использовать объект AlertDialog, перенастроенный методом AlertDialog.Builder.show(). Нет необходимости звонить AlertDialog.Builder.create().

Пример:

        AlertDialog dialog = alertbox.show();
        if(monsterint > playerint) {
            Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
            button.setEnabled(false);
        }
person Ashraf Sousa    schedule 17.10.2014