Закрийте віртуальну клавіатуру при натисканні на кнопку


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);
Peter Ajtai

5
Вам також потрібно імпортувати Context.
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
Виняток лову замість простої нульової перевірки, серйозно ?!
Д-р Скло

Працюючи на мене, приховує клавіатуру на натисканні кнопки
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

Тепер натискання кнопки "Готово" на віртуальній клавіатурі та кнопці зробить те саме - приховає клавіатуру та виконує дії клацання.


Відмінно, але я не зовсім слідкую. Я думаю, що публікація з'їла частину коду (у вашому зразку нічого немає після "публічної пустоти"). Я спробував встановитиOnEditorActionListner методом onCreate своєї діяльності, але він не знає, що таке setOnEditorActionListener. Я отримую сповіщення "Анонімний внутрішній тип". (Я роблю це у своєму методі Activity onCreate
Андрій

1
Схоже, в цьому коді є кілька помилок, але це правильна ідея. З одного боку, інтерфейс OnEditorActionListener - це внутрішній клас, тому вам потрібно або імпортувати його явно (Eclipse у цьому випадку не зробить це для вас) або посилатися на нього як TextView.OnEditorActionListener.
MatrixFrog

У мене є проблеми. Я реалізував onEditorActionListener (публічний клас SearchActivity розширює ListActivity реалізує OnClickListener, OnEditorActionListener), я приєднав слухача до свого EditText (mSearchText.setOnEditorActionListener (це); (TextView v, int actionId, подія KeyEvent)). У ньому сказано, що він повинен перекрити метод надкласового класу. Будь-які ідеї?
Андрій

Привіт, ви можете вбудувати свій OnEditorActionListener, набравши yourEditView.setOnEditorActionListener (новий OnEditorActionListener () {....
піксель

11

Додайте такий код у подію натискання кнопки:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

1
Працює як шарм!
coderpc

10

Оскільки у вас є лише один текст редагування, просто виконайте виклик для цього редагування тексту всередині вашої кнопки, а решта обробляється системою. Якщо у вас було більше одного редакційного тексту, це було б не так вже й ефективно, тому що ви повинні спочатку отримати цілеспрямований редакційний текст. Але у вашому випадку це спрацює ідеально

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
Чи можете ви залишити пояснення, чому ваше рішення працює, щоб інші могли зрозуміти і навчитися з нього? Дякую!
Шон

Впевнений Шон. Я щойно відредагував верхню частину, оскільки я новачок у постановці, якщо це не ясно, просто дайте мені знати, і я розширюся кнопкою onclick
Laert

Повірте, це один із найелегантніших способів цього зробити. Спасибі @Laert
WitVault

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

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, було б чудово, якби ви могли розширити її за допомогою деяких пояснень, щоб переконатися, що майбутні читачі можуть скористатись повною мірою!
дерм

1

Приклад Котліна:

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)

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 () не є нульовим:

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

-2

Якщо ви встановите android:singleLine="true", кнопка автоматично приховує клавіатуру

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.