AlertDialoug фокусируется на EditText при отклонении .. вызывая появление клавиатуры.. что делать?

#android #focus #android-edittext #android-alertdialog

#Android #фокус #android-edittext #android-alertdialog

Вопрос:

Я использую AlertDialog, чтобы всплывать и запрашивать у пользователя некоторую информацию, когда пользователь нажимает на кнопку.

Диалоговое окно работает нормально, и я получаю информацию о пользователе, которую оно само отклоняет.

Однако, когда приложение возвращает фокус к моему основному виду.. это установка фокуса на виджет EditText, который вызывает отображение клавиатуры для этого представления.

Я не хочу, чтобы клавиатура отображалась, если пользователь явно не сфокусируется на этом поле, так как мне изменить / переопределить поведение по умолчанию, чтобы оно не автоматически фокусировалось на этом поле после отклонения AlertDialog.

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

(Нет, текст редактирования не находится где-либо рядом с кнопками диалогового окна оповещения, поэтому не похоже, что второе нажатие или что-то еще происходит случайно или щелчок передается вверх по стеку.)

Ответ №1:

Попробуйте сделать это после закрытия диалогового окна:

 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
  

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

1. Я думаю, проблема в том, что я не знаю, какое событие перехватить, чтобы зафиксировать, когда alertdialog был отклонен. У меня это вызывает вызовы hidekeyboard в самом классе dialog для всех кнопок, но это не решает проблему, потому что edittext фокусируется, когда он возвращается на родительский экран после закрытия диалогового окна. Итак, я думаю, реальный вопрос в том, что мне нужно сделать, чтобы уловить, что оповещение закрыто, и выполнить мой метод hideKeyboard?

2. У вас уже установлен OnDismissListener (см. developer.android.com/reference/android/content / … )? Ах, только что отправил и увидел ваше обновление. Хорошо.

3. Femi. Я сделал, но без кубиков, onDismiss вызывается до повторного отображения базового представления и фокусировки EDITTEXT.. К сожалению, OnDismissListener ничего мне не дал. Похоже, что Android что-то делает с представлением после отклонения AlertDialog, перерисовывает или перефокусирует или что-то, что заставляет этот EditText сфокусироваться и отображать его клавиатуру.. Я понятия не имею, что это такое, но что-то происходит

4. Странно: может быть, попробовать прикрепить прослушиватель фокуса к редактируемому тексту в OnDismissListener, а затем скрыть клавиатуру и удалить прослушиватель фокуса? Своего рода плохой взлом, но может сдвинуть вас с мертвой точки. Я ожидаю, что со временем вы поймете, что именно вызывает это безумие, но это может занять некоторое время.

5. Интересно: вы правы, я бы подумал, что клавиатура автоматически отключится при закрытии диалогового окна, но я предполагаю, что видимость клавиатуры привязана к состоянию объекта Window, и, строго говоря, диалоговое окно является частью окна Activity, поэтому оно будет сохраняться. Это исчезло бы, если бы вы запустили другое действие (которое было бы другим окном), но не если бы вы просто запустили / закрыли диалоговое окно.

Ответ №2:

Вы можете попросить InputMethodManager отключить клавиатуру при закрытии диалогового окна:

 EditText mValue; //The input view in your Dialog

//Close the keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mValue.getWindowToken(), 0);
  

Надеюсь, это поможет!

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

1. Беспроводной, я пробовал это .. У меня есть метод, который скрывает все клавиатуры .. базовый вызов hideSoftInputFromWindow, как в вашем примере кода, но с mValue, являющимся каждым виджетом EditText в моем приложении, и я вызываю его при отклонении AlertDialog… но фокус EditText происходит ПОСЛЕ отклонения диалогового окна предупреждения, поэтому он просто выводит клавиатуру для этого поля EditText.

2. Извините, я должен был быть более ясным… Скорее всего, проблема не в том, что EditText сфокусирован, что вызывает проблему. Для вызова метода ввода требуется нечто большее, чем просто фокус. Это элементы EditText В вашем диалоговом окне, которые прикреплены к IME (это то, что представляет mValue). Вызывайте этот код при нажатии кнопок, чтобы закрыть диалоговое окно до того, как оно будет фактически закрыто.

Ответ №3:

Проблема заключалась в том, как указано в комментариях выше, я не удалял клавиатуру из ALERTDIALOG, я работал над ложным предположением, что, когда диалоговое окно будет закрыто, клавиатура тоже будет закрыта. Это предположение было неверным.

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

Попытки отключить клавиатуру в диалоговом окне discharge listener не привели к удалению клавиатуры, потому что они пытались отключить клавиатуру для полей в родительском окне, и во время их выполнения она все еще была привязана к полю в alertview.

Добавление вызовов dismissskeyboard к событиям onclick, которые прекратили набор номера для полей edittext в AlertDialog, устраняет проблему.

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

1. Смотрите ниже для более подробного обсуждения. Спасибо Femi за помощь мне.