Невозможно найти кнопку в AlertDialog, пока я не вызову Показать .. почему?Разве он не должен быть доступен после CREATE? - PullRequest
0 голосов
/ 14 июня 2011

У меня есть диалоговое окно с предупреждением, что у меня есть 2 текстовых поля, а затем кнопка Положительный и Отрицательный.

Я пытался установить nextFocusDown в конечном текстовом поле на ВСЕГДА быть положительной кнопкой.

Положительные и отрицательные кнопки располагаются рядом друг с другом под вторым текстовым полем, и если курсор для пользовательского ввода был над левой кнопкой, следующий фокус переместился бы влево, если бы он был над правой кнопкой.он переместился бы на правую кнопку.

Поэтому я использую свой конструктор оповещений, чтобы СОЗДАТЬ диалог оповещения, а затем попытался вызвать

myAlertDialog.getButton (DialogInterface.BUTTON_POSITIVE);а затем установите в полях ExitText nextFocusDownId идентификатор этой кнопки.

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

Увы, ad.getButton возвращает значение NULL каждый раз.Когда я перемещаю эти строки кода после вызова ad.show (), все работает отлично.

Итак, я думаю, у меня есть вопрос, может ли кто-нибудь объяснить это мне.Я бы подумал, что после того, как я установил ПОЗИТИВНУЮ КНОПКУ и создал AlertDialog, представление должно существовать, но не быть видимым ... очевидно, это не тот случай, поэтому ничто, кроме DisplayWidget, не создается до тех пор, пока представление фактически не отобразится какобщее правило?Когда взгляды завышены, я могу найти объекты внутри них, прежде чем я их покажу.Так каково общее эмпирическое правило относительно этого?

Ответы [ 3 ]

0 голосов
/ 14 июня 2011

Вот пример кода, заполняющего диалог. Может быть, вы должны использовать аналогичный подход, а затем настроить кнопки:

LayoutInflater li = LayoutInflater.from(ctx);
View view = li.inflate(R.layout.promptdialog, null);
//get a builder and set the view
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setTitle("Prompt");
builder.setView(view);
0 голосов
/ 14 июня 2011

Это ограничения использования AlertDialog.Builder.Как и предполагалось, ваши взгляды еще не раздуты.Это не обязательно означает, что нет доступа к этим представлениям, пока не появится диалоговое окно.Вы можете надувать взгляды самостоятельно и изменять по желанию.См. документы в пользовательских диалогах .Вы можете раздуть свои собственные представления и затем использовать setView, чтобы установить View для Dialog.К сожалению, это сильно отрицает простоту, которую обеспечивает Builder.

0 голосов
/ 14 июня 2011

Я думаю, что ваши последние утверждения / вопросы находятся на правильном пути.Вызов show() в диалоговом окне раздувается и показывает вид.Так что в некотором смысле имеет смысл, что вы не можете взаимодействовать с представлением в коде, пока не появится диалоговое окно.Я не вижу особых условий для гонки, если ваш код для управления диалогом появляется сразу после вызова show().

В частности, вот что говорит Javadoc:

show() - Запустите диалоговое окно и отобразите его на экране.

Таким образом, диалоговое окно не «запускается», пока не будет вызван show().

...