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

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

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

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

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


person Andrew    schedule 03.08.2010    source источник


Ответы (14)


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

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

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

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

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

person Paul Maserrat    schedule 21.11.2011
comment
Примечание: (если вы хотите использовать этот метод в тех случаях, когда может не быть фокуса (например, onPause () и т. Д.): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); - person Peter Ajtai; 16.02.2012
comment
Вам также необходимо импортировать Context. - person Si8; 22.07.2013
comment
ВНИМАНИЕ: выдает NPE, если клавиатура уже скрыта. Следуйте за комментарием Питера, чтобы избежать этого. - person Don Larynx; 21.05.2015
comment
почему клавиатура появляется после нажатия на нерелевантную кнопку? может кто-нибудь дать объяснение или ссылку? - person kommradHomer; 25.01.2016
comment
Работает как шарм! - person ARiF; 02.09.2016

Использовать код ниже

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) {

        }
    }
});
person Prashant Maheshwari Andro    schedule 01.12.2014
comment
Перехват исключения вместо простой нулевой проверки, серьезно ?! - person Dr Glass; 06.11.2016
comment
Работает для меня, скрывает клавиатуру при нажатии кнопки - person ashishdhiman2007; 18.03.2017
comment
простое решение того, что мне было нужно: скрыть клавиатуру после нажатия кнопки поиска. - person dawoodman71; 27.04.2017

Вы должны реализовать 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

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

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

Для деятельности,

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);
person Priya Rajan    schedule 16.11.2017

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

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
person Ashana.Jackol    schedule 09.04.2015
comment
Работает как шарм! - person coderpc; 25.07.2017

В вашем случае, поскольку у вас есть только один EditText, я считаю, что приведенное ниже решение является лучшим. Если у вас было более одного компонента EditText, вам нужно было бы сосредоточиться на EditText, который вы хотите закрыть, или вызвать указанную ниже функцию для каждого EditText. Однако для вас это работает блестяще:

editText.onEditorAction(EditorInfo.IME_ACTION_DONE);

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

person Laert    schedule 09.03.2017
comment
Можете ли вы оставить объяснение, почему ваше решение работает, чтобы другие могли понять и извлечь из него уроки? Спасибо! - person Shawn; 15.03.2017
comment
Конечно, Шон. Я только что отредактировал верхнюю часть, так как я новичок в позировании, если это неясно, просто дайте мне знать, и я расширюсь с помощью кнопки onclick - person Laert; 17.03.2017
comment
Поверьте, это один из самых элегантных способов сделать это. Спасибо @Laert - person WitVault; 08.09.2017
comment
Это действительно лучший способ! - person Gaurav Mall; 03.06.2021

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

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);
}
person Giedrius Šlikas    schedule 20.07.2017

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

  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);
    
person Affa Musaffa    schedule 09.11.2016
comment
Для метода скрытой клавиатуры это инструмент (скрыть, если отображается, показать, если скрыт), а не скрытие, - person Ninja Coding; 22.06.2017

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

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)
person norbDEV    schedule 10.08.2018

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

// 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);
}
person Pankaj Talaviya    schedule 26.10.2016

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

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
person CacheMeOutside    schedule 29.04.2017

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

person Terranology    schedule 14.04.2016

person    schedule
comment
Меня устраивает. Спасибо! - person Aman Goyal; 29.04.2019

person    schedule
comment
Привет! Хотя этого ответа может хватить на @Andrew, было бы здорово, если бы вы могли дополнить его некоторыми пояснениями, чтобы будущие читатели могли извлечь из этого максимальную пользу! - person derM; 04.05.2017