Закрыть виртуальную клавиатуру при нажатии кнопки

133

У меня есть Activityс EditText, кнопки и ListView. Цель состоит в том, чтобы ввести экран поиска в EditText, нажать кнопку и получить результаты поиска для заполнения этого списка.

Это все работает отлично, но виртуальная клавиатура ведет себя странно.

Если я нажимаю EditText, я получаю виртуальную клавиатуру. Если я нажму кнопку «Готово» на виртуальной клавиатуре, она исчезнет. Однако, если я нажму кнопку поиска, прежде чем нажать «Готово» на виртуальной клавиатуре, виртуальная клавиатура останется, и я не смогу от нее избавиться. Нажатие кнопки «Готово» не закрывает клавиатуру. Она меняет кнопку «Готово» с «Готово» на стрелку и остается видимой.

Спасибо за вашу помощь

Андрей
источник

Ответы:

304
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

Я положил это сразу после onClick(View v)события.

Вам нужно импортировать android.view.inputmethod.InputMethodManager;

Клавиатура прячется при нажатии кнопки.

Пол Мазеррат
источник
55
Примечание: (в случае, если вы хотите использовать этот метод в тех случаях, когда может не быть фокуса (например, onPause () и т. Д.): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Питер Айтай
5
Вы также должны импортировать контекст.
Si8
4
ВНИМАНИЕ: Выдает NPE, если клавиатура уже скрыта. Следуйте комментариям Питера, чтобы избежать этого.
Дон Ларинкс
почему клавиатура появляется после нажатия на нерелевантную кнопку? кто-нибудь может дать какое-то объяснение или ссылку?
kommradHomer
1
Работает как шарм!
ARiF
59
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});
Андрей
источник
Меня устраивает. Спасибо!
Аман
29

Используйте код ниже

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});
Прашант Махешвари Андро
источник
2
Перехват исключения вместо простой нулевой проверки, серьезно ?!
Dr Glass
Работая для меня, скрывает клавиатуру при нажатии кнопки
ashishdhiman2007
простое решение того, что мне было нужно: скрыть клавиатуру после нажатия кнопки поиска.
dawoodman71
13

Вы должны реализовать OnEditorActionListenerдля своего EditView

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

И вы скрываете клавиатуру:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

Вы должны также запустить скрытие клавиатуры в вашей кнопке, используя onClickListener

Теперь нажатие «Готово» на виртуальной клавиатуре и кнопке сделает то же самое - скроет клавиатуру и выполнит действие щелчка.

пиксель
источник
Отлично, но я не совсем понимаю. Я думаю, что пост съел часть кода (в вашем примере нет ничего после "public void"). Я попытался установитьOnEditorActionListner в методе onCreate моей Activity, но он не знает, что такое setOnEditorActionListener. Я получаю уведомление «Анонимный внутренний тип». (Я делаю это в своем методе Activity onCreate) i37.tinypic.com/6ozkig.png
Эндрю
1
Похоже, в этом коде есть пара ошибок, но это правильная идея. Во-первых, интерфейс OnEditorActionListener является внутренним классом, поэтому вам нужно либо импортировать его явно (в этом случае Eclipse не сделает этого за вас), либо называть его TextView.OnEditorActionListener.
MatrixFrog
У меня немного неприятностей. Я реализовал onEditorActionListener (открытый класс SearchActivity расширяет ListActivity, реализует OnClickListener, OnEditorActionListener), я подключил слушателя к моему EditText (mSearchText.setOnEditorActionListener (this);), но Eclipse не позволяет мне переопределить обработчик onEditor public (TextView v, int actionId, событие KeyEvent)). В нем говорится, что он должен переопределить метод суперкласса. Любые идеи?
Андрей
Здравствуйте! Вы можете встроить свой OnEditorActionListener, набрав yourEditView.setOnEditorActionListener (new OnEditorActionListener () {....
пиксель
11

Добавьте следующий код в событие нажатия кнопки:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Ashana.Jackol
источник
1
Работает как шарм!
coderpc
10

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

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)
Лаэрт
источник
1
Можете ли вы оставить объяснение, почему ваше решение работает, чтобы другие могли понять и извлечь из него уроки? Спасибо!
Шон
Конечно, Шон. Я только что отредактировал верхнюю часть, так как я новичок в позировании, если что-то неясно, просто дайте мне знать, и я
Лаэрт
Поверьте, это один из самых элегантных способов сделать это. Спасибо @Laert
WitVault 08
9

Для активности,

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

Для фрагментов используйте getActivity ()

. GetActivity () getSystemService ();

. GetActivity () getCurrentFocus ();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
Прия Раджан
источник
7

Это решение идеально подходит для меня:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
Гедрюс Шликас
источник
3

Попробуй это...

  1. Для отображения клавиатуры

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Для Скрыть клавиатуру

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
Аффа Мусаффа
источник
Метод «Скрыть клавиатуру» - это тогл (спрятать, если он виден, показать, если он спрятан), а не спрятаться,
Ninja Coding
1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}
Фаррух Хабибуллаев
источник
Здравствуй! Хотя этого ответа может быть достаточно для удовлетворения потребностей @Andrew, было бы здорово, если бы вы могли дополнить его некоторыми объяснениями, чтобы будущие читатели могли извлечь выгоду в полной мере!
derM
1

Пример Kotlin:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

из фрагмента:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

от деятельности:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
norbDEV
источник
0

Вы используете этот код в вашем событии нажатия кнопки

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Панкадж Талавия
источник
0

Исправление исключения нулевой точки сбоя: у меня был случай, когда клавиатура могла не открываться, когда пользователь нажимал кнопку. Вы должны написать оператор if, чтобы проверить, что getCurrentFocus () не имеет значения NULL:

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
CacheMeOutside
источник
-2

Если вы установили android:singleLine="true", автоматически кнопка скрывает клавиатуру ¡

Terranology
источник