Android отклонить клавиатуру

147

Как убрать клавиатуру при нажатии кнопки?

Manikandan
источник
Сделать EditText Focusable = False делает работу. Вы хотите полностью его отключить?
2010 г.

Ответы:

325

Вы хотите отключить или закрыть виртуальную клавиатуру?

Если вы хотите просто отклонить его, вы можете использовать следующие строки кода в кнопке при нажатии кнопки «Событие».

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
DeRagan
источник
1
Две проблемы с этим .... одна заключается в том, что myEditText должен быть Final. Во-вторых, я должен знать, какое поле EditText имеет фокус. Любое решение этого?
Итан Аллен
78
Для любого другого, кто спотыкается здесь, вы можете использовать действие (или активность, в которой вы находитесь, или фрагменты getActivity()) getCurrentFocus().getWindowToken()для первого аргумента hideSoftInputFromWindow(). Кроме того, делайте это в, onPause()а не в том onStop()случае, если вы пытаетесь заставить его исчезнуть при смене действий.
Дрейк Кларрис
2
Этот ответ, в сочетании с комментарием здесь, полностью решил мою проблему!
Авещини
9
Какой уродливый, уродливый подход к распусканию клавиатуры. Я надеюсь, что в будущем есть более чистый способ сделать такую ​​простую вещь.
Subby
73

Решение, приведенное выше, работает не для всех устройств, кроме того, оно использует EditText в качестве параметра. Это мое решение, просто вызовите этот простой метод:

private void hideSoftKeyBoard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

    if(imm.isAcceptingText()) { // verify if the soft keyboard is open                      
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}
user2167877
источник
3
isAcceptingText()сделал этот ответ лучше других
user1506104
Хорошее решение ... в редких случаях isAcceptingText () может возвращать значение false, когда клавиатура все еще находится на экране, например, щелкнуть от EditText до текста, который можно выбрать, но не редактировать в том же окне.
Джорджи
29

Это мое решение

public static void hideKeyboard(Activity activity) {
    View v = activity.getWindow().getCurrentFocus();
    if (v != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
}
RPM
источник
Это если вы знаете вид, который вызвал отображение клавиатуры.
RPM
16

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Kandha
источник
13

Вот решение Kotlin (смешивая различные ответы в теме)

Создать функцию расширения (возможно, в общем классе ViewHelpers)

fun Activity.dismissKeyboard() {
    val inputMethodManager = getSystemService( Context.INPUT_METHOD_SERVICE ) as InputMethodManager
    if( inputMethodManager.isAcceptingText )
        inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, /*flags:*/ 0)
}

Тогда просто потребляйте используя:

// from activity
this.dismissKeyboard()

// from fragment
activity.dismissKeyboard()
Marchy
источник
5

Первое решение с InputMethodManager работало для меня как победитель, метод getWindow (). SetSoftInputMode не работал на Android 4.0.3 HTC Amaze.

@ За исключением Аллена, мне не нужно было окончательно редактировать текст. Может быть, вы используете внутренний класс EditText, который вы объявили содержащий метод? Вы можете сделать EditText переменной класса Activity. Или просто объявите новый EditText внутри внутреннего класса / метода и снова используйте findViewById (). Кроме того, я не нашел, что мне нужно было знать, какой EditText в форме был в фокусе. Я мог бы просто выбрать один произвольно и использовать его. Вот так:

    EditText myEditText= (EditText) findViewById(R.id.anyEditTextInForm);  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
Энди
источник
3
Добро пожаловать в стек переполнения! Это действительно комментарий, а не ответ. С немного большим количеством представителей вы сможете оставлять комментарии .
Джек,
4
    public static void hideSoftInput(Activity activity) {
    try {
        if (activity == null || activity.isFinishing()) return;
        Window window = activity.getWindow();
        if (window == null) return;
        View view = window.getCurrentFocus();
        //give decorView a chance
        if (view == null) view = window.getDecorView();
        if (view == null) return;

        InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm == null || !imm.isActive()) return;
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    } catch (Throwable e) {
        e.printStackTrace();
    }
}
androidmalin
источник
1

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


fun Context.dismissKeyboard() {
    val imm by lazy { this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
    val windowHeightMethod = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
    val height = windowHeightMethod.invoke(imm) as Int
    if (height > 0) {
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
    }
}

Махмуд Маброк
источник
0

Используя контекст представления, мы можем достичь желаемого результата с помощью следующих методов расширения в Kotlin:

/**
 * Get the [InputMethodManager] using some [Context].
 */
fun Context.getInputMethodManager(): InputMethodManager {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return getSystemService(InputMethodManager::class.java)
    }

    return getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}

/**
 * Dismiss soft input (keyboard) from the window using a [View] context.
 */
fun View.dismissKeyboard() = context
        .getInputMethodManager()
        .hideSoftInputFromWindow(
                windowToken
                , 0
        )

Как только они на месте, просто позвоните:

editTextFoo.dismiss()
masterwok
источник