Закрыть / скрыть программную клавиатуру Android

3164

У меня есть EditText и Button в моем макете.

После записи в поле редактирования и нажатия на Button, я хочу скрыть виртуальную клавиатуру. Я предполагаю, что это простой кусок кода, но где я могу найти его пример?

  • 12
    Что если у вас есть только один EditText и несколько кнопок, таких как флажки и радио? Единственное место, где вам нужна клавиатура, находится в одном EditText. Как зарегистрироваться, чтобы узнать, что что-то еще было выбрано / щелкнуто для того, чтобы скрыть клавиатуру?
  • 13
    я чувствую себя глупо. Я не могу спрятать клавиатуру на ICS. Перепробовал здесь все методы и их комбинации. Ни за что. Способ показать это работает, но я не могу скрыть это независимо от того, какой токен ветра, скрыть флаги, настройки манифеста или свечи для любых святых. На показе клавиатуры я всегда вижу это: I / LatinIME (396): указан InputType.TYPE_NULL W / LatinIME (396): неожиданный класс ввода: inputType = 0x00000000 imeOptions = 0x00000000
Показать ещё 7 комментариев
Теги:
android-layout
android-softkeyboard
android-input-method
soft-keyboard

86 ответов

1443
Лучший ответ

Чтобы прояснить это безумие, я хотел бы начать с извинения от имени всех пользователей Android за совершенно нелепое обращение Google с программной клавиатурой. Причина в том, что существует так много разных ответов на один и тот же простой вопрос, потому что этот API, как и многие другие в Android, разработан ужасно. Я не могу придумать никакого вежливого способа заявить об этом.

Я хочу спрятать клавиатуру. Я ожидаю предоставить Android следующее утверждение: Keyboard.hide(). Конец. Большое спасибо. Но у Android есть проблема. Вы должны использовать InputMethodManager чтобы скрыть клавиатуру. Хорошо, хорошо, это Android API для клавиатуры. НО! Вы должны иметь Context, чтобы получить доступ к IMM. Теперь у нас есть проблема. Я могу захотеть скрыть клавиатуру от статического или служебного класса, который не нужен и не нужен для какого-либо Context. или И еще хуже, IMM требует, чтобы вы указали, какой View (или, что еще хуже, Window) вы хотите скрыть от клавиатуры.

Это то, что делает скрытие клавиатуры таким сложным. Уважаемый Google: Когда я просматриваю рецепт торта, на Земле нет RecipeProvider, который отказался бы предоставить мне этот рецепт, если я сначала не отвечу, КТО будет съеден торт И где он будет съеден !!

Эта печальная история заканчивается уродливой правдой: чтобы скрыть Android клавиатуру, вам будет необходимо предоставить 2 форму идентификации: а Context и либо View или Window.

Я создал метод статической утилиты, который может выполнять работу ОЧЕНЬ надежно, при условии, что вы вызываете его из Activity.

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //Find the currently focused view, so we can grab the correct window token from it.
    View view = activity.getCurrentFocus();
    //If no view currently has focus, create a new one, just so we can grab a window token from it
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Помните, что этот служебный метод работает ТОЛЬКО при вызове из Activity ! Вышеупомянутый метод вызывает getCurrentFocus целевой Activity чтобы получить правильный маркер окна.

Но предположим, что вы хотите скрыть клавиатуру от EditText размещенного в DialogFragment? Вы не можете использовать метод выше для этого:

hideKeyboard(getActivity()); //won't work

Это не сработает, потому что вы передадите ссылку на Activity узла Fragment, которая не будет иметь сфокусированного контроля, пока отображается Fragment ! Вот Это Да! Итак, чтобы скрыть клавиатуру от фрагментов, я прибегаю к более низкому уровню, более распространенному и более уродливому:

public static void hideKeyboardFrom(Context context, View view) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Ниже приведена дополнительная информация, полученная из-за потраченного времени в погоне за этим решением:

О программе windowSoftInputMode

Есть еще одна точка зрения, о которой нужно знать. По умолчанию Android автоматически назначит начальный фокус первому элементу EditText или фокусируемому элементу управления в вашей Activity. Естественно, что InputMethod (обычно это программная клавиатура) будет реагировать на событие фокуса, показывая себя. windowSoftInputMode в AndroidManifest.xml, когда установлено значение stateAlwaysHidden, stateAlwaysHidden клавиатуру игнорировать этот автоматически назначенный начальный фокус.

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

Почти невероятно, кажется, что он ничего не делает для предотвращения открытия клавиатуры при прикосновении к focusable="false" управления (если только focusable="false" и/или focusableInTouchMode="false" не назначен элемент управления). По-видимому, параметр windowSoftInputMode применяется только к событиям автоматической фокусировки, а не к событиям фокусировки, вызванным событиями касания.

Поэтому stateAlwaysHidden действительно ОЧЕНЬ плохо назван. Возможно, вместо этого следует называть ignoreInitialFocus.

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


ОБНОВЛЕНИЕ: Больше способов получить жетон окна

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

Это альтернативы для приведенного выше кода if (view == null) view = new View(activity); Это не относится явно к вашей деятельности.

Внутри класса фрагмента:

view = getView().getRootView().getWindowToken();

Задан фрагмент fragment в качестве параметра:

view = fragment.getView().getRootView().getWindowToken();

Начиная с вашего содержания:

view = findViewById(android.R.id.content).getRootView().getWindowToken();

ОБНОВЛЕНИЕ 2: Снимите фокус, чтобы снова не показывать клавиатуру, если вы открываете приложение из фона

Добавьте эту строку в конец метода:

view.clearFocus();

  • 1
    Я не думаю, что вы должны модифицировать softInputMode. Это переопределит настройки AndroidManifest.
  • 1
    согласился, что лучше в манифесте - это всего лишь попытка грубой силы вещи
Показать ещё 24 комментария
4048

Вы можете заставить Android скрывать виртуальную клавиатуру, используя InputMethodManager, вызывая hideSoftInputFromWindow, передавая токен окна, содержащего ваше сфокусированное представление.

// 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);
}

Это заставит клавиатуру быть спрятанной во всех ситуациях. В некоторых случаях вы захотите передать InputMethodManager.HIDE_IMPLICIT_ONLY в качестве второго параметра, чтобы гарантировать, что вы скрываете клавиатуру только тогда, когда пользователь явно не заставлял ее появляться (удерживая меню).

Примечание: если вы хотите сделать это в Kotlin, используйте: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

Котлин Синтаксис

// Check if no view has focus:
 val view = this.currentFocus
 view?.let { v ->
  val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as 
  InputMethodManager imm?.let { hideSoftInputFromWindow(v.windowToken, 0) }
 }
  • 13
    Спасибо, это работает отлично, если использовать 0 в качестве второго параметра. Но если я использую InputMethodManager.HIDE_IMPLICIT_ONLY, клавиатура никогда не будет скрыта (хотя я не удерживаю меню). Есть намеки?
  • 24
    Здорово. Просто чтобы уточнить, это только отклоняет это, если присутствует, но не препятствует тому, чтобы это появилось, правильно?
Показать ещё 33 комментария
800

Также полезно скрывать мягкую клавиатуру:

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

Это может быть использовано для подавления мягкой клавиатуры до тех пор, пока пользователь не коснется экрана editText.

  • 109
    Вы также можете добиться того же эффекта, добавив android: windowSoftInputMode = "stateHidden" к своей активности в манифесте.
  • 0
    Это было больше того, что я искал, мне не нужна клавиатура для одного занятия, но она остается открытой для другого занятия. Это отлично скрыло мою активность без клавиатуры! +1
Показать ещё 12 комментариев
300

У меня есть еще одно решение скрыть клавиатуру:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

Здесь пропустите HIDE_IMPLICIT_ONLY в позиции showFlag и 0 в позиции hiddenFlag. Он будет принудительно закрывать мягкую клавиатуру.

  • 3
    Вы используете скрытый флаг в параметре showflags. Это работает только потому, что константы используют одни и те же целые числа. Пример использования правильных флагов
  • 0
    протестировано на Android 4.0, мне нравится это решение, потому что у меня есть несколько текстов для редактирования, кнопки для этого действия, которые могут иметь фокус
Показать ещё 10 комментариев
135

Решение Meier работает и для меня. В моем случае верхний уровень моего приложения - tabHost, и я хочу скрыть ключевое слово при переключении вкладок - я получаю маркер окна из вида tabHost.

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}
  • 0
    Я получил это для работы с SearchView тоже. Смотрите мой ответ ниже. Спасибо, МакКосс!
126

Пожалуйста, попробуйте этот код ниже в onCreate()

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);
  • 2
    Этот метод работает как средство устранения ошибки «не скрывать программную клавиатуру» в 2.0 и 2.1, как описано в code.google.com/p/android/issues/detail?id=7115 ... метод hideSoftInputFromWindow перечисленные выше не работали, когда я пытался это сделать, но editView.setInputType (0) делал.
  • 17
    Это допустимо для каждого Javadoc (не хака), хотя я бы переписал метод как editView.setInputType(InputType.TYPE_NULL);
Показать ещё 4 комментария
122

Update: Я не знаю, почему это решение больше не работает (я только что тестировал на Android 23). Вместо этого используйте решение Saurabh Pareek. Вот он:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

Старый ответ:

//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
  • 8
    Где я должен разместить этот код? Я пытался вставить getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); в onCreate (), но клавиатура никогда не скрывается
  • 0
    не работает, протестировано в radioGroup.setOnCheckedChangeListener, API 23
Показать ещё 4 комментария
69
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}
  • 4
    Это сработало для меня! Но почему вы положили input.setInputType (0) ? Я не мог взаимодействовать с EditTextView, когда у меня была эта строка кода (она работала, когда я ее удалял).
  • 0
    Возможно input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE) .
Показать ещё 1 комментарий
62

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

Создайте функцию с этим, чтобы управлять некоторыми свойствами EditText:

public void setEditTextFocus(boolean isFocused) {
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);

    if (isFocused) {
        searchEditText.requestFocus();
    }
}

Затем убедитесь, что в фокусе EditText вы открываете/закрываете клавиатуру:

searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (v == searchEditText) {
            if (hasFocus) {
                // Open keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
            } else {
                // Close keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
            }
        }
    }
});

Теперь, когда вы хотите открыть клавиатуру вручную, выполните следующие действия:

setEditTextFocus(true);

И для закрытия вызова:

setEditTextFocus(false);
  • 0
    +1 - если вы хотите начать действие с закрытой клавиатурой, используйте это решение и добавьте onclicklistener, который устанавливает setEditTextFocus (true). Работает как шарм!
  • 0
    Я получил «Не удается разрешить контекст символа» в 7-й и 10-й строке второго блока кода.
Показать ещё 1 комментарий
55

Saurabh Pareek имеет лучший ответ.

Можно также использовать правильные флаги.

/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

Пример реального использования

/* click button */
public void onClick(View view) {      
  /* hide keyboard */
  ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
      .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

  /* start loader to check parameters ... */
}

/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
    /* parameters not valid ... */

    /* show keyboard */
    ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
        .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

    /* parameters valid ... */
}
  • 0
    В 2.1 клавиатура все равно всплывает, потом прячется. Нехорошо.
  • 1
    Это самый эффективный вариант для последней версии. Всегда нужно настроить его для более старых версий. Особенно до v3.
Показать ещё 4 комментария
47

Короткий ответ

В своем OnClick прослушивающем вызове onEditorAction EditText с IME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
    }
});

Развертка

Я считаю, что этот метод лучше, проще и более согласован с шаблоном проектирования Android. В простом примере выше (и, как правило, в большинстве распространенных случаев) у вас будет EditText, у которого есть/есть фокус, и обычно он обычно вызывал клавиатуру в первую очередь (она, безусловно, может вызывать это во многих распространенных сценариях). Таким же образом, он должен быть тем, кто выпустит клавиатуру, обычно это можно сделать с помощью ImeAction. Просто посмотрите, как ведет себя EditText с android:imeOptions="actionDone", вы хотите добиться того же поведения теми же средствами.


Отметьте этот связанный ответ

  • 0
    Это ответ. Единственный метод, который работает кросс-версия. Я вернулся к этому вопросу, чтобы опубликовать этот ответ, потому что я не думал, что кто-то еще знал
  • 0
    Это должен быть правильный ответ. Вместо того, чтобы обманывать Android, чтобы скрыть клавиатуру, когда она действительно должна быть там, мы говорим ему, что пользователь завершил, что, в свою очередь, вызывает ту же ImeAction [глупое имя, я признаю], как если бы пользователь нажал «DONE» на клавиатуре , Таким образом, не имеет значения, если пользователь подтверждает ввод с клавиатуры или нажимает кнопку пользовательского интерфейса.
47

из этого поиска, здесь я нашел ответ, который работает для меня

// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
43

Это должно работать:

public class KeyBoard {

    public static void show(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }

    public static void hide(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    }

    public static void toggle(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm.isActive()){
            hide(activity); 
        } else {
            show(activity); 
        }
    }
}

KeyBoard.toggle(activity);
  • 0
    Сработало частично, даже если клавиатура была скрыта, isActive () возвращает false!
  • 0
    Конечно, это так и должно быть. Или, может быть, я вас не понимаю. В любом случае, вы можете дополнить класс методами hide() и show() чтобы иметь больше контроля над тем, когда он должен показываться, а когда нет. У меня работает, я тоже так сделал :) Пример редактирования
Показать ещё 3 комментария
40

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

В v3.2.4_r1 setSoftInputShownOnFocus(boolean show) был добавлен контроль погоды или нет, чтобы отобразить клавиатуру, когда TextView получает фокус, но ее все еще скрыто, поэтому необходимо использовать отражение:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    try {
        Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
        method.invoke(mEditText, false);
    } catch (Exception e) {
        // Fallback to the second method
    }
}

Для более старых версий я получил очень хорошие результаты (но далеки от совершенства) с помощью OnGlobalLayoutListener, добавленного с помощью ViewTreeObserver из моего корневого представления, а затем проверки, отображается ли клавиатура следующим образом:

@Override
public void onGlobalLayout() {
    Configuration config = getResources().getConfiguration();

    // Dont allow the default keyboard to show up
    if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
    }
}

Это последнее решение может отображать клавиатуру в течение секунды секунды и беспорядок с дескрипторами выделения.

Когда клавиатура входит во весь экран, onGlobalLayout не вызывается. Чтобы избежать этого, используйте TextView # setImeOptions (int) или в XML-декларации TextView:

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

Обновление: Просто нашел, какие диалоги используют, чтобы никогда не показывать клавиатуру и работать во всех версиях:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
  • 0
    Спасибо. Два флага FLAG_ALT_FOCUSABLE_IM и FLAG_ALT_FOCUSABLE_IM - фактически единственное, что помогло в моем случае. Я не хотел, чтобы в моей деятельности отображалась клавиатура - даже когда пользователь нажимал текст редактирования. (Я сделал свою собственную "клавиатуру").
  • 0
    флаги FLAG_ALT_FOCUSABLE_IM решили мою проблему
Показать ещё 3 комментария
29
public void setKeyboardVisibility(boolean show) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(show){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }else{
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    }
}
25

В качестве альтернативы все это решение, если вы хотите закрыть мягкую клавиатуру из любого места без ссылки на (EditText) поле, которое использовалось для открытия клавиатуры, но все же хотело сделать это, если поле было сфокусировано, вы могли бы использовать это (из Activity):

if (getCurrentFocus() != null) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
25

Я провел более двух дней, работая над всеми решениями, размещенными в потоке, и обнаружил, что они так или иначе не испытывают недостатка. Мое точное требование состоит в том, чтобы иметь кнопку, которая со 100% -й надежностью покажет или скроет экранную клавиатуру. Когда клавиатура находится в скрытом состоянии, она не должна появляться повторно, независимо от того, какие поля ввода пользователь нажимает. Когда он находится в своем видимом состоянии, клавиатура не должна исчезать независимо от того, какие кнопки пользователь нажимает. Это должно работать на Android 2.2+ вплоть до новейших устройств.

Вы можете увидеть рабочую реализацию этого в моем приложении очистить RPN.

После тестирования многих предложенных ответов на нескольких разных телефонах (включая устройства froyo и gingerbread) стало очевидно, что приложения для Android могут быть надежно:

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

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

К сожалению, пункты 2 и 3 в списке работают только надёжно, когда начинается действие. Как только активность станет видимой, вы не сможете надолго скрыть или показать клавиатуру. Хитрость заключается в том, чтобы фактически перезапустить свою активность, когда пользователь нажимает кнопку переключения клавиатуры. В моем приложении, когда пользователь нажимает кнопку переключения клавиатуры, выполняется следующий код:

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

Это заставляет текущую активность сохранять свое состояние в Bundle, а затем запускается активность, проходя через логическое значение, указывающее, следует ли показывать или скрывать клавиатуру.

Внутри метода onCreate выполняется следующий код:

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Если мягкая клавиатура должна быть показана, то InputMethodManager будет предложено отобразить клавиатуру, и в окне указывается, что мягкий вход всегда отображается. Если мягкая клавиатура должна быть скрыта, то устанавливается WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM.

Этот подход работает надежно на всех устройствах, на которых я тестировал: от 4-летнего телефона HTC, работающего под управлением Android 2.2 до версии 7. 4.2.2. Единственным недостатком такого подхода является то, что вам нужно быть осторожным при обращении с кнопкой "Назад". Поскольку у моего приложения есть только один экран (его калькулятор), я могу переопределить onBackPressed() и вернуться на главный экран устройства.

  • 1
    сложный обходной путь, но я думаю, что это слишком много, чтобы воссоздать тысячи объектов, просто чтобы скрыть клавиатуру. Я не знаю, кто разработал IMM для Android, но он пахнет как Windows APi. На мой взгляд, хороший IME должен иметь два метода: скрыть и показать :-)
  • 0
    Это все правда, но мой обходной путь имеет одно преимущество - он всегда работает! Я не мог найти другого решения, которое бы всегда переключало клавиатуру, независимо от того, какие поля в пользовательском интерфейсе имеют фокус, что пользователь сделал для переключения и клавиатуры и какую версию андроида они запускают: - \
Показать ещё 2 комментария
22

Благодаря this SO answer, я получил следующее, которое в моем случае прекрасно работает при прокрутке фрагментов ViewPager...

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

private void showKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}
18

Выше ответы работают для разных сценариев, но Если вы хотите скрыть клавиатуру внутри представления и попытаться получить правильный контекст, попробуйте это:

setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        hideSoftKeyBoardOnTabClicked(v);
    }
}

private void hideSoftKeyBoardOnTabClicked(View v) {
    if (v != null && context != null) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

и получить контекст извлечения из конструктора:)

public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}
17

Если вы хотите закрыть мягкую клавиатуру во время работы устройства или функционального теста, вы можете сделать это, нажав кнопку "Назад" в своем тесте:

// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

Я помещаю "кавычки" в кавычки, так как приведенное выше не вызывает onBackPressed() для рассматриваемой Деятельности. Он просто закрывает клавиатуру.

Не забудьте сделать паузу на некоторое время, прежде чем двигаться дальше, так как требуется немного времени, чтобы закрыть кнопку "Назад", поэтому последующие клики на "Представления" и т.д. не будут зарегистрированы до тех пор, пока после короткой паузы (1 секунда достаточно долгое время).

14

Вот как вы это делаете в Mono для Android (AKA MonoDroid)

InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
    imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);
  • 1
    Что такое searchbox во фрагменте?
  • 0
    @PCoder я думаю, что его текст редактирования
13

Добавьте в свою активность android:windowSoftInputMode="stateHidden" в файл манифеста. Пример:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>
13

Это сработало для меня для всего необычного поведения клавиатуры

private boolean isKeyboardVisible() {
    Rect r = new Rect();
    //r will be populated with the coordinates of your view that area still visible.
    mRootView.getWindowVisibleDisplayFrame(r);

    int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
    return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}

protected void showKeyboard() {
    if (isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (getCurrentFocus() == null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    } else {
        View view = getCurrentFocus();
        inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
    }
}

protected void hideKeyboard() {
    if (!isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View view = getCurrentFocus();
    if (view == null) {
        if (inputMethodManager.isAcceptingText())
            inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
    } else {
        if (view instanceof EditText)
            ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
        inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}
  • 1
    Думаю, я попробовал 10 ответов до этого. Оставил надежду. Спасибо чувак.
  • 0
    Что такое mRootView?
11

Простой и простой в использовании метод, просто вызовите hideKeyboardFrom (YourActivity.this);, чтобы скрыть клавиатуру

/**
 * This method is used to hide keyboard
 * @param activity
 */
public static void hideKeyboardFrom(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
11

В некоторых случаях эти методы могут работать, кроме всех остальных. Это экономит мой день:)

public static void hideSoftKeyboard(Activity activity) {
    if (activity != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (activity.getCurrentFocus() != null && inputManager != null) {
            inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
            inputManager.hideSoftInputFromInputMethod(activity.getCurrentFocus().getWindowToken(), 0);
        }
    }
}

public static void hideSoftKeyboard(View view) {
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputManager != null) {
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
11

Я почти попробовал все эти ответы, у меня были некоторые случайные проблемы, особенно с галактикой Samsung s5.

То, что я получаю, заставляет показывать и скрывать, и он отлично работает:

/**
 * Force show softKeyboard.
 */
public static void forceShow(@NonNull Context context) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

/**
 * Force hide softKeyboard.
 */
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
    if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
        editText.requestFocus();
    }
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
11

используйте этот

this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
11

В моем случае я использовал SearchView в панели действий. После того, как пользователь выполнит поиск, клавиатура снова откроется.

Использование InputMethodManager не закрывало клавиатуру. Мне нужно было очиститьфокус и настроить фокусное изображение поиска на false:

mSearchView.clearFocus();
mSearchView.setFocusable(false);
  • 1
    Очень умно. Если пользователь хочет другой поиск, просто нажмите поиск еще раз.
  • 0
    У SearchView нет функции clearFocus() на страницах API Android, поэтому у меня это не сработало, но сработало другое решение (см. Мой ответ ниже).
Показать ещё 1 комментарий
10

У меня есть случай, где my EditText может быть также расположен в AlertDialog, поэтому клавиатура должна быть закрыта при увольнении. Следующий код, кажется, работает где угодно:

public static void hideKeyboard( Activity activity ) {
    InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
    View f = activity.getCurrentFocus();
    if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
        imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
    else 
        activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}
  • 1
    Это решение лучше, потому что вам не нужно контролировать, какой EditText передает в качестве параметра методу hideSoftInputFromWindow (). Отлично работает !!
10

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

if (this.getCurrentFocus() != null) {
    InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
9
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

после этого вызова onTouchListener:

findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Utils.hideSoftKeyboard(activity);
        return false;
    }
});
  • 0
    Попробуйте также - это сработало для меня: InputMethodManager imm = ((InputMethodManager) getSystemService (Activity.INPUT_METHOD_SERVICE)); imm.hideSoftInputFromWindow (getWindow (). getCurrentFocus (). getWindowToken (), 0);
8

Работает как волшебное прикосновение каждый раз

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

}

private void openKeyboard() {
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    if(imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    }
}
8

Для открытой клавиатуры:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edtView, InputMethodManager.SHOW_IMPLICIT);

Для клавиш "Закрыть/скрыть":

 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 imm.hideSoftInputFromWindow(edtView.getWindowToken(), 0);
  • 0
    спасибо, это работает для меня
8

Вы также можете изучить setImeOption в EditText.

У меня была очень симулирующая ситуация, когда в моем макете был EditText и кнопка поиска. Когда я обнаружил, что могу просто установить опцию ime на "actionSearch" на моем editText, я понял, что мне больше не нужна кнопка поиска. На мягкой клавиатуре (в этом режиме) есть значок поиска, который можно использовать для запуска поиска (и клавиатура закрывается, как и следовало ожидать).

  • 0
    Есть ли какой-нибудь трюк для автоматического закрытия клавиатуры в этом методе? это не так на желе. текст редактирования теряет фокус, но клавиатура не скрывается.
7

иногда все, что вам нужно, это кнопка ввода, чтобы сложить keyboard дать поле EditText вас есть атрибут

 android:imeOptions="actionDone" 

это изменит кнопку Enter на кнопку Done, которая закроет клавиатуру.

  • 0
    в моем случае, кроме android:imeOptions="actionDone" также необходимо включить android:singleLine="true"
6

Попробуйте

  • Просто вы можете позвонить в свой Activity

 public static void hideKeyboardwithoutPopulate(Activity activity) {
    InputMethodManager inputMethodManager =
            (InputMethodManager) activity.getSystemService(
                    Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(
            activity.getCurrentFocus().getWindowToken(), 0);
}

  • В своем MainActivitiy вызовите

 hideKeyboardwithoutPopulate(MainActivity.this);

6

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

Следующий рабочий стол работает, если вы поместите его в конце onCreate

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
            }
        },100);
6

Это работает для меня..

EditText editText=(EditText)findViewById(R.id.edittext1);

поставьте ниже строку кода в onClick()

editText.setFocusable(false);
editText.setFocusableInTouchMode(true);

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

(OR),

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
5

Я написал небольшое расширение для Kotlin, если кто-то заинтересовался, не очень проверял это:

fun Fragment.hideKeyboard(context: Context = App.instance) {
    val windowToken = view?.rootView?.windowToken
    windowToken?.let {
        val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(windowToken, 0)
    }
}

App.instance является статическим объектом "this", хранящимся в приложении

Обновление: в некоторых случаях windowToken имеет значение null. Я добавил дополнительный способ закрытия клавиатуры с помощью отражения, чтобы определить, закрыта ли клавиатура

/**
 * If no window token is found, keyboard is checked using reflection to know if keyboard visibility toggle is needed
 *
 * @param useReflection - whether to use reflection in case of no window token or not
 */
fun Fragment.hideKeyboard(context: Context = MainApp.instance, useReflection: Boolean = true) {
    val windowToken = view?.rootView?.windowToken
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    windowToken?.let {
        imm.hideSoftInputFromWindow(windowToken, 0)
    } ?: run {
        if (useReflection) {
            try {
                if (getKeyboardHeight(imm) > 0) {
                    imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
                }
            } catch (exception: Exception) {
                Timber.e(exception)
            }
        }
    }
}

fun getKeyboardHeight(imm: InputMethodManager): Int = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight").invoke(imm) as Int
5

Это работает.

Просто передайте свой текущий экземпляр активности в функции

 public void isKeyBoardShow(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    if (imm.isActive()) {
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    } else {
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }
}
5

Если вы хотите скрыть клавиатуру с помощью Java-кода, используйте следующую команду:

  InputMethodManager imm = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
  imm.hideSoftInputFromWindow(fEmail.getWindowToken(), 0);

Или, если вы хотите всегда скрывать клавиатуру, используйте ее в AndroidManifest:

 <activity
 android:name=".activities.MyActivity"
 android:configChanges="keyboardHidden"  />
  • 0
    Решение java-кода работало для меня фрагментом, когда я заменил fEmail видом, открывающим клавиатуру. Он работал на Samsung Galaxy Tab S2 под управлением Android 5.1.1, Nexus 5 под управлением 6.0.1 и XT1032 под управлением 5.1 (это использование библиотек поддержки).
5

В AndroidManifest.xml под <activity..> установите android:windowSoftInputMode="stateAlwaysHidden"

5
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
  • 2
    Этот ответ опасен, потому что код может вызвать исключение NullPointerException. activity.getCurrentFocus() может вернуть ноль.
4

На самом деле, авторитет Android всегда дает новые обновления, но они не устраняют свои старые недостатки, с которыми сталкиваются все разработчики Android в своей разработке. Это должно быть обработано авторитетом Android по умолчанию, при изменении фокуса с EditText следует скрыть/показать параметр клавиатуры мягкого ввода. Но извините, они не справляются. Хорошо Оставь это.

Ниже приведены решения для отображения/скрытия/переключения параметра клавиатуры в разделе "Деятельность" или "Фрагмент".

Показать клавиатуру для просмотра:

/**
 * open soft keyboard.
 *
 * @param context
 * @param view
 */
public static void showKeyBoard(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.showSoftInput(view, 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Показать клавиатуру в контексте действия:

/**
 * open soft keyboard.
 *
 * @param mActivity context
 */
public static void showKeyBoard(Activity mActivity) {
    try {
        View view = mActivity.getCurrentFocus();
        if (view != null) {
            InputMethodManager keyboard = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.showSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.SHOW_FORCED);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Показать клавиатуру с контекстом фрагмента:

/**
 * open soft keyboard.
 *
 * @param mFragment context
 */
public static void showKeyBoard(Fragment mFragment) {
    try {
        if (mFragment == null || mFragment.getActivity() == null) {
            return;
        }
        View view = mFragment.getActivity().getCurrentFocus();
        if (view != null) {
            InputMethodManager keyboard = (InputMethodManager) mFragment.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.showSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.SHOW_FORCED);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Скрыть клавиатуру для просмотра:

/**
 * close soft keyboard.
 *
 * @param context
 * @param view
 */
public static void hideKeyBoard(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Скрыть клавиатуру в контексте действия:

/**
 * close opened soft keyboard.
 *
 * @param mActivity context
 */
public static void hideSoftKeyboard(Activity mActivity) {
    try {
        View view = mActivity.getCurrentFocus();
        if (view != null) {
            InputMethodManager inputManager = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Скрыть клавиатуру с контекстом фрагмента:

/**
 * close opened soft keyboard.
 *
 * @param mFragment context
 */
public static void hideSoftKeyboard(Fragment mFragment) {
    try {
        if (mFragment == null || mFragment.getActivity() == null) {
            return;
        }
        View view = mFragment.getActivity().getCurrentFocus();
        if (view != null) {
            InputMethodManager inputManager = (InputMethodManager) mFragment.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Переключить клавиатуру:

/**
 * toggle soft keyboard.
 *
 * @param context
 */
public static void toggleSoftKeyboard(Context context) {
    try {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
4

просто код: используйте этот код в onCreate()

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
3

Если вы используете Kotlin для разработки своего приложения, это действительно легко сделать.

Добавьте это расширение функций:

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

fun Activity.hideKeyboard() {
    val inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    val view = currentFocus
    if (view != null) {
        inputManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}

Для фрагмента:

fun Fragment.hideKeyboard() {
    activity?.let {
        val inputManager = it.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        val view = it.currentFocus
        if (view != null) {
            inputManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    }
}

Теперь вы можете просто позвонить в своем фрагменте или деятельности:

 hideKeyboard()
3

Здесь есть оба метода скрытия и показа.

Котлин

fun hideKeyboard(activity: Activity) {
    val v = activity.currentFocus
    val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(v != null)
    imm.hideSoftInputFromWindow(v!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val v = activity.currentFocus
    val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(v != null)
    imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT)
}

Джава

public static void hideKeyboard(Activity activity) {
    View v = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert imm != null && v != null;
    imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View v = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert imm != null && v != null;
    imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
}
3

Очень простой способ

Я делаю это во всех своих проектах и ​​работаю как сон. В ваших объявлениях layout.xml просто добавьте эту единственную строку:

android:focusableInTouchMode="true"

Полный пример кода:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusableInTouchMode="true">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </ListView>

</android.support.constraint.ConstraintLayout>
  • 0
    благодарю вас! это действительно самый простой способ
3

Вот лучшие решения

Решение 1) Установите для параметра inputType значение "text"

<EditText
android:id="@+id/my_edit_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Tap here to type"
android:inputType="text" />

Это также можно выполнить программно. метод setInputType() (унаследованный от TextView).

EditText editText = (EditText) findViewById(R.id.my_edit_text);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT | 
InputType.TYPE_TEXT_VARIATION_NORMAL);

Решение 2) Используйте InputMethodManager.hideSoftInputFromWindow()

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

или

InputMethodManager imm = (InputMethodManager) 
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 
InputMethodManager.HIDE_NOT_ALWAYS);
3
final RelativeLayout llLogin = (RelativeLayout) findViewById(R.id.rl_main);
        llLogin.setOnTouchListener(
                new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View view, MotionEvent ev) {
                        InputMethodManager imm = (InputMethodManager) this.getSystemService(
                                Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
                        return false;
                    }
                });
3

простой метод ребята: попробуйте это...

private void closeKeyboard(boolean b) {

        View view = this.getCurrentFocus();

        if(b) {
            if (view != null) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            }
        }
        else {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(view, 0);
        }
    }
3

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

public void disableSoftKeyboard(final EditText v) {
    if (Build.VERSION.SDK_INT >= 11) {
        v.setRawInputType(InputType.TYPE_CLASS_TEXT);
        v.setTextIsSelectable(true);
    } else {
        v.setRawInputType(InputType.TYPE_NULL);
        v.setFocusable(true);
    }
}
3
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity
            .getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus()
            .getWindowToken(), 0);
}
  • 1
    хороший ответ, но activity.getCurrentFocus() может вернуть null
2

Если вы хотите скрыть клавиатуру вручную по нажатию кнопки:

/**
 * Hides the already popped up keyboard from the screen.
 *
 */
public void hideKeyboard() {
    try {
        // use application level context to avoid unnecessary leaks.
        InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        assert inputManager != null;
        inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Когда вы хотите скрыть клавиатуру, где бы вы ни щелкали на экране, кроме edittext, переопределите этот метод в своей деятельности:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    View view = getCurrentFocus();
    if (view != null && (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) && view instanceof EditText && !view.getClass().getName().startsWith("android.webkit.")) {
        int scrcoords[] = new int[2];
        view.getLocationOnScreen(scrcoords);
        float x = ev.getRawX() + view.getLeft() - scrcoords[0];
        float y = ev.getRawY() + view.getTop() - scrcoords[1];
        if (x < view.getLeft() || x > view.getRight() || y < view.getTop() || y > view.getBottom())
            ((InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow((this.getWindow().getDecorView().getApplicationWindowToken()), 0);
    }
    return super.dispatchTouchEvent(ev);
}
2

В Котлине

fun hideKeyboard(activity: BaseActivity) {
        val view = activity.currentFocus?: View(activity)
        val imm = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }
2

В Android, чтобы скрыть Vkeyboard с помощью InputMethodManage, вы можете скрывать hideSoftInputFromWindow, передавая в токене окна, содержащего ваше сфокусированное представление.

View view = this.getCurrentFocus();
if (view != null) {  
InputMethodManager im = 
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Вызывая editText.clearFocus(), а затем InputMethodManager.HIDE_IMPLICIT_ONLY даже работает

2

вы можете просто добавить этот код, где вы хотите скрыть мягкую клавиатуру "

                        // Check if no view has focus:
                            View view = getCurrentFocus();
                            if (view != null) {
                                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                            }
2

Это сработало для меня.

public static void hideKeyboard(Activity act, EditText et){
    Context c = act.getBaseContext();
    View v = et.findFocus();
    if(v == null)
        return;
    InputMethodManager inputManager = (InputMethodManager) c.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
2

Этот метод всегда будет работать любой ценой. Просто используйте его везде, где вы хотите скрыть клавиатуру.

public static void hideSoftKeyboard(Context mContext,EditText username){
        if(((Activity) mContext).getCurrentFocus()!=null && ((Activity) mContext).getCurrentFocus() instanceof EditText){
            InputMethodManager imm = (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(username.getWindowToken(), 0);
        }
    }

Используйте его следующим образом:

Какова бы ни была версия Android. Этот метод, несомненно, будет работать

2

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

public class MyActivity extends Activity
{
    /** This maintains true if the keyboard is open. Otherwise, it is false. */
    private boolean isKeyboardOpen = false;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        LayoutInflater inflater;
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View contentView = inflater.inflate(context.getResources().getIdentifier("main", "layout", getPackageName()), null);

        setContentView(contentView);
        contentView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
        {
            public void onGlobalLayout() 
            {
                Rect r = new Rect();
                contentView.getWindowVisibleDisplayFrame(r);
                int heightDiff = contentView.getRootView().getHeight() - (r.bottom - r.top);
                if (heightDiff > 100) 
                    isKeyboardVisible = true;
                else
                    isKeyboardVisible = false;
             });
         }
    }

    public void closeKeyboardIfOpen()
    {
        InputMethodManager imm;
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (isKeyboardVisible)
            imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
    }   
}
1

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

public void hideKeyBoard() {
    View view1 = this.getCurrentFocus();
    if(view!= null){
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view1.getWindowToken(), 0);
    }
}
1

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

fun View.hideKeyboard() = this.let {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)
}

Пример использования с активностью

window.decorView.hideKeyboard();

Пример использования с представлением

etUsername.hideKeyboard();

Счастливое кодирование...

1

Вдохните все эти ответы, просто для того, чтобы быть достаточно простыми, я написал общий метод для этого:

/**
 * hide soft keyboard in a activity
 * @param activity
 */
public static void hideKeyboard (Activity activity){
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    if (activity.getCurrentFocus() != null) {
        InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
    }
}
1

Альтернативой, использующей SearchView, является использование этого кода:

searchView = (SearchView) searchItem.getActionView();    
searchView.setOnQueryTextListener(new OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        InputMethodManager imm = (InputMethodManager)
        getSystemService(getApplicationContext().INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(searchView.getApplicationWindowToken(), 0);
    }
}

Это поле поиска SearchView в ActionBar, которое при отправке текста из запроса (пользователь нажимает клавишу Enter или кнопку/значок поиска), тогда код InputMethodManager активируется и делает ваш мягкий клавиатура идет вниз. Этот код был помещен в мой onCreateOptionsMenu(). searchItem - от MenuItem, который является частью кода по умолчанию для onCreateOptionsMenu(). Спасибо @mckoss за хороший кусок этого кода!

1
public static void closeInput(final View caller) {  
    caller.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) caller.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(caller.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }, 100);
}

Этот метод обычно работает, но есть одно условие: вы не можете установить android:windowSoftInputMode="any_of_these"

1

Пробовал все здесь в отчаянии, объединяя все методы, и, разумеется, клавиатура не будет закрываться в Android 4.0.3 (она работала в Honeicomb AFAIR).

Затем неожиданно я обнаружил явно выигрышную комбинацию:

textField.setRawInputType(InputType.TYPE_CLASS_TEXT |InputType.TYPE_TEXT_VARIATION_NORMAL);

в сочетании с вашими обычными рецептами

blahblaj.hideSoftInputFromWindow ...

надеюсь, что это помешает кому-то совершить самоубийство. Я был близок к этому. Конечно, я понятия не имею, почему это работает.

0

Привет Это просто, если вы работаете с Kotlin, я верю, что вы можете легко преобразовать код в Java тоже сначала в своей деятельности, используйте эту функцию, когда ваша деятельность загружается, например, в вызове onCreate().

fun hideKeybord (){
val inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (inputManager.isAcceptingText){
    inputManager.hideSoftInputFromWindow(currentFocus.windowToken, 0)
}

}

как я уже упоминал, вызовите эту функцию в методе onCreate(), а затем добавьте эту android:windowSoftInputMode="stateAlwaysHidden" к своей деятельности в файле manafest.xml. Вот так...

<activity
    android:name=".Activity.MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.NoActionBar"
    android:windowSoftInputMode="stateAlwaysHidden">
0

Для пользователей kotlin здесь есть метод расширения kotlin, который работал для моих случаев использования:

fun View.hideKeyboard() {
    val imm = this.context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)
}

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

0

Вики ответ в Котлине:

1 - Создайте функцию верхнего уровня внутри файла (например, файл, который содержит все ваши функции верхнего уровня):

fun Activity.hideKeyboard(){
    val imm = this.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    var view = currentFocus
    if (view == null) { view = View(this) }
    imm.hideSoftInputFromWindow(view.windowToken, 0)
}

2 - Затем назовите это в любой деятельности, в которой это было необходимо:

this.hideKeyboard()
0
public void hideKeyboard() 
{
    if(getCurrentFocus()!=null) 
    {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}


public void showKeyboard(View mView) {
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    mView.requestFocus();
    inputMethodManager.showSoftInput(mView, 0);
}
0
 fun hideKeyboard(appCompatActivity: AppCompatActivity) {
        val view = appCompatActivity.currentFocus
        val imm = appCompatActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }
0

Для Xamarin. Android:

public void HideKeyboard()
{
    var imm = activity.GetSystemService(Context.InputMethodService).JavaCast<InputMethodManager>();
    var view = activity.CurrentFocus ?? new View(activity);
    imm.HideSoftInputFromWindow(view.WindowToken, HideSoftInputFlags.None);
}
0

Чтобы показать клавиатуру при запуске приложения:

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
        view.requestFocus();
        new Handler().postDelayed(new Runnable() {
            public void run() {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
            }
        }, 1000);
0

Я использую следующие расширения активности Kotlin:

/**
 * Hides soft keyboard if is open.
 */
fun Activity.hideKeyboard() {
    currentFocus?.windowToken?.let {
        (getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager?)
                ?.hideSoftInputFromWindow(it, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}

/**
 * Shows soft keyboard and request focus to given view.
 */
fun Activity.showKeyboard(view: View) {
    view.requestFocus()
    currentFocus?.windowToken?.let {
        (getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager?)
                ?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}
0

Некоторые коды kotlin:

Скрыть клавиатуру из Activity:

(currentFocus ?: View(this))
            .apply { (getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
                        .hideSoftInputFromWindow(windowToken, 0) }
0

Если ваше приложение нацелено на уровень API 21 или более, чем используется метод по умолчанию:

editTextObj.setShowSoftInputOnFocus(false);

Убедитесь, что вы указали код ниже в теге EditText XML.

<EditText  
    ....
    android:enabled="true"
    android:focusable="true" />
0

версия Котлин

val imm: InputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
  • 0
    Создание функции расширения в Activity выглядит как достойный подход. fun Activity.closeKeyboard() { (getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).apply { hideSoftInputFromWindow(window.decorView.windowToken, 0) } }
0

После прочтения всех ответов выше и в другом сообщении мне все еще не удалось автоматически открыть клавиатуру.

В моем проекте я динамически создавал диалог (AlertDialog) (программируя его без или с минимальным необходимым XML).

Итак, я делал что-то вроде:

    dialogBuilder = new AlertDialog.Builder(activity);

    if(dialogBuilder==null)
        return false; //error

    inflater      = activity.getLayoutInflater();
    dialogView    = inflater.inflate(layout, null);
    ...

И после завершения настройки всех представлений (TextView, ImageView, EditText и т.д.) я сделал:

        alertDialog = dialogBuilder.create();

        alertDialog.show();

После игры со всеми ответами я узнал, что большинство из них работают IF, вы знаете WHERE, чтобы отправить запрос... И это было ключом ко всем.

Итак, трюк заключается в том, чтобы создать ПЕРЕД создание диалога: alertDialog.show() в моем случае это работало как шарм:

        alertDialog = dialogBuilder.create();           
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

        //And only when everything is finished - let bring up the window - 
        alertDialog.show();

        //Viola... keyboard is waiting for you open and ready...
        //Just don't forget to request focus for the needed view (i.e. EditText..)

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

Небольшой запрос от команды разработчиков SDK Android:

Я думаю, что все это не нужно, поскольку вы можете видеть, что тысячи программистов со всего мира занимаются этой нелепой и тривиальной проблемой, а ее решение должно быть чистым и простым: IMHO, если я получаю requestFocus() для ориентированного на ввод вида (например, EditText), клавиатура должна открываться автоматически, если пользователь не спрашивает, поэтому я считаю, что метод requestFocus() является ключевым здесь и должен accept boolean showSoftKeyboard со значением по умолчанию true: View.requestFocus(boolean showSoftKeyboard);

Надеюсь, это поможет другим, как я.

0

Вам нужно только написать одну строку внутри тега активности манифеста

 android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

и он будет работать.

0
use Text watcher instead of EditText.and after you finished entering the input 

вы можете использовать

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

окружает его с помощью try catch, так что клавиатура уже закрыта, приложение не будет аварийно:

try{

View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}catch (Exception e)
{
  e.printStackTrace();
}
0
/** 
 *
 *   Hide I Said!!!
 *
 */
public static boolean hideSoftKeyboard(@NonNull Activity activity) {
    View currentFocus = activity.getCurrentFocus();
    if (currentFocus == null) {
        currentFocus = activity.getWindow().getDecorView();
        if (currentFocus != null) {
            return getSoftInput(activity).hideSoftInputFromWindow(currentFocus.getWindowToken(), 0, null);
        }
    }
    return false;
}

public static boolean hideSoftKeyboard(@NonNull Context context) {
   if(Activity.class.isAssignableFrom(context.getClass())){
       return hideSoftKeyboard((Activity)context);
   }
   return false;
}

public static InputMethodManager getSoftInput(@NonNull Context context) {
    return (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
}
0

Я пробовал все решения очень много, но решение для меня не срабатывало, поэтому я нашел свое решение: У вас должны быть такие логические переменные, как:

public static isKeyboardShowing = false;
InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

И в событии с сенсорным экраном вы вызываете:

@Override
public boolean onTouchEvent(MotionEvent event) {
    if(keyboardShowing==true){
        inputMethodManager.toggleSoftInput(InputMethodManager.RESULT_UNCHANGED_HIDDEN, 0);
        keyboardShowing = false;
    }
    return super.onTouchEvent(event);
}

И в EditText находится где угодно:

yourEditText.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            yourClass.keyboardShowing = true;

        }
    });
0
private void hideSoftKeyboard() {
    View view = getView();
    if (view != null) {
        InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
                .getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
}
-1

Попробуйте это в Котлине

 private fun hideKeyboard(){
    val imm = activity!!.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(activity!!.currentFocus!!.windowToken, 0)
}

Попробуйте это на Java

 private void hideKeyboard(){
  InputMethodManager imm =(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
  imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
-3

Это работает для меня:

 @Override
 public boolean dispatchTouchEvent(MotionEvent event) {
View v = getCurrentFocus();
boolean ret = super.dispatchTouchEvent(event);

if (v instanceof EditText) {
    View w = getCurrentFocus();
    int scrcoords[] = new int[2];
    w.getLocationOnScreen(scrcoords);
    float x = event.getRawX() + w.getLeft() - scrcoords[0];
    float y = event.getRawY() + w.getTop() - scrcoords[1];

    Log.d("Activity",
            "Touch event " + event.getRawX() + "," + event.getRawY()
                    + " " + x + "," + y + " rect " + w.getLeft() + ","
                    + w.getTop() + "," + w.getRight() + ","
                    + w.getBottom() + " coords " + scrcoords[0] + ","
                    + scrcoords[1]);
    if (event.getAction() == MotionEvent.ACTION_UP
            && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
                    .getBottom())) {

        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                .getWindowToken(), 0);
    }
}
return ret;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню