Клавіатура Android відхилити


147

Як відмовитись від клавіатури при натисканні кнопки?


Зробіть EditText Focusable = False виконує завдання. Ви хочете його повністю відключити?
st0le

Відповіді:


325

Ви хочете відключити або відхилити віртуальну клавіатуру?

Якщо ви хочете просто відхилити його, ви можете використовувати наступні рядки коду у вашій кнопці, натиснувши кнопку "Подія"

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

1
Дві проблеми з цим .... одна полягає в тому, що myEditText повинен бути остаточним. По-друге, я повинен знати, на якому вікні EditText є фокус. Будь-яке рішення цього?
Етан Аллен

78
Для всіх, хто спіткнувся тут, ви можете використовувати активність (або діяльність, в якій ви перебуваєте, або фрагменти getActivity()) getCurrentFocus().getWindowToken()для першого аргументу hideSoftInputFromWindow(). Крім того, зробіть це в, onPause()а не в тому onStop()випадку, якщо ви намагаєтесь змусити його піти під час зміни діяльності.
Дрейк Кларріс

2
Ця відповідь у поєднанні з коментарем тут повністю вирішила мою проблему!
aveschini

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

3
isAcceptingText()зробили цю відповідь краще за інших
user1506104

Гарне рішення ... в рідкісних випадках isAcceptingText () може повернути помилкове значення, коли клавіатура все ще знаходиться на екрані, наприклад, натисніть кнопку "Відправити текст" до тексту, який можна вибрати, але не редагувати в тому ж вікні.
Георгі

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

16

Ви також можете використовувати цей код при події натискання кнопки

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

13

Ось рішення Котліна (змішування різних відповідей у ​​потоці)

Створіть функцію розширення (можливо, у загальному класі 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()

5

Перше рішення з InputMethodManager для мене працювало як чемпіон, метод getWindow (). Метод setSoftInputMode не працював на android 4.0.3 HTC Amaze.

@Ethan Allen, мені не потрібно було редагувати текст остаточним. Можливо, ви використовуєте внутрішній клас EditText, який ви оголосили методом, що містить? Ви можете зробити EditText змінною класу Діяльності. Або просто оголосіть новий 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();
    }
}

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

Використовуючи контекст подання, ми можемо досягти бажаного результату за допомогою наступних методів розширення в Котліні:

/**
 * 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.