Android. Как скрыть программную клавиатуру из диалогового окна с несколькими текстами EditText при нажатии вне любого из них?

Мне было интересно, есть ли в диалоговом окне с несколькими текстами EditText способ скрыть программную клавиатуру, если пользователь щелкает за пределами любого из них? В этом диалоговом окне МНОГО EditTexts, и я хотел бы, чтобы пользователь мог легко скрыть мягкую клавиатуру.

Поскольку EditText представлены в виде таблицы, я предпочитаю не использовать imeOptions="actionDone" для каждого отдельного EditText, поскольку бывают случаи, когда пользователю необходимо вводить данные во весь столбец. Однако, если пользователю нужно ввести только частичные данные, мне бы хотелось, чтобы пользователь мог щелкнуть за пределами любого EditText и скрыть программную клавиатуру.

Я искал здесь несколько решений, но ни одно из них, похоже, не работает для моего сценария. Они, кажется, работают только в деятельности.


person Pink Jazz    schedule 14.03.2017    source источник


Ответы (3)


Вы пытались установить OnTouchListener для ViewGroup родителя всех этих EditText? и когда MotionEvent не используется ни одним из них (метод возвращает true/false), запустите свой метод hideKeyboard();? (некоторые примеры ЗДЕСЬ)

также вы написали

и я хотел бы, чтобы пользователь мог скрыть мягкую клавиатуру.

разве Back физическая/экранная кнопка не предназначена для этого? Всегда доступен в одном и том же месте на передней панели устройства, самый простой способ... (для обычных устройств, может быть, у вас есть какие-то нестандартные...) Но я признаю, что прикосновение за пределами любой EditText закрывающей клавиатуры удобно для UX

person snachmsm    schedule 14.03.2017

Хорошо, похоже, что установка корневого и дочернего контейнеров на clickable, focusable и focusableInTouchMode на true сделала свое дело вместе со следующим кодом:

public void hideKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

public void setupDialog(View view) {
    // Set up touch listener for non-text box views to hide keyboard.
    if (!(view instanceof EditText)) {
        view.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View view, MotionEvent event) {
                hideKeyboard(view);
                return false;
            }
        });
    }

    //If a layout container, iterate over children and seed recursion.
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            View innerView = ((ViewGroup) view).getChildAt(i);
            setupDialog(innerView);
        }
    }
}

Где вы передаете идентификатор корневого представления диалога.

person Pink Jazz    schedule 15.03.2017

Ни один пользователь не щелкает за пределами EditText, чтобы выйти из него. Вам лучше использовать «actionGo» или «actionDone» для ваших полей ввода.

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

InputMethodManager imm = (InputMethodManager) getSystemService(
INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

Затем убедитесь, что у вас есть это для вашего EditText:

android:clickable="true" 
android:focusableInTouchMode="true" 
person Фред Генкин    schedule 14.03.2017