Android odrzuca klawiaturę


147

Jak zamknąć klawiaturę po naciśnięciu przycisku?


Make a EditText Focusable = False spełnia swoje zadanie. Czy chcesz to całkowicie wyłączyć?
— st0le

Odpowiedzi:


325

Chcesz wyłączyć lub odrzucić wirtualną klawiaturę?

Jeśli chcesz go po prostu odrzucić, możesz użyć następujących wierszy kodu w zdarzeniu przycisku po kliknięciu

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

1
Dwa problemy z tym… jeden to fakt, że myEditText musi być ostateczna. Po drugie, muszę wiedzieć, które pole EditText jest aktywne. Jakieś rozwiązanie tego?
— Ethan Allen,

78
Dla każdego, kto się tutaj potknie, możesz użyć aktywności (aktywności, w której jesteś, lub fragmentów getActivity()) getCurrentFocus().getWindowToken()jako pierwszej argumentacji hideSoftInputFromWindow(). Rób to także w trybie, onPause()a nie, onStop()jeśli chcesz, aby to zniknęło podczas zmiany czynności.
— Drake Clarris

2
Ta odpowiedź, w połączeniu z komentarzem tutaj, całkowicie rozwiązała mój problem!
— aveschini

9
Co za brzydkie, brzydkie podejście do odrzucenia klawiatury. Mam nadzieję, że w przyszłości będzie łatwiejszy sposób na zrobienie tak prostej rzeczy.
— Subby

73

Powyższe rozwiązanie nie działa dla wszystkich urządzeń, a ponadto używa EditText jako parametru. To jest moje rozwiązanie, po prostu wywołaj tę prostą metodę:

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()uczynił tę odpowiedź lepszą niż inni
— user1506104

Dobre rozwiązanie ... w rzadkich przypadkach isAcceptingText () może zwrócić false, gdy klawiatura jest nadal na ekranie, na przykład kliknij poza przyciskiem EditText na tekst, który można zaznaczyć, ale nie edytować w tym samym oknie.
— Georgie

29

To jest moje rozwiązanie

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

Dzieje się tak, jeśli znasz widok, który spowodował wyświetlenie klawiatury.
— RPM

16

Możesz również użyć tego kodu w przypadku kliknięcia przycisku

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

13

Oto rozwiązanie Kotlin (mieszanie różnych odpowiedzi w wątku)

Utwórz funkcję rozszerzającą (być może we wspólnej klasie ViewHelpers)

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

Następnie po prostu skonsumuj, używając:

// from activity
this.dismissKeyboard()

// from fragment
activity.dismissKeyboard()

5

Pierwsze rozwiązanie z InputMethodManager działało jak mistrz dla mnie, metoda getWindow (). SetSoftInputMode nie działała na Androidzie 4.0.3 HTC Amaze.

@Ethan Allen, nie musiałem kończyć edycji tekstu. Może używasz klasy wewnętrznej EditText, w której zadeklarowałeś metodę zawierającą? Możesz uczynić EditText zmienną klasy działania. Lub po prostu zadeklaruj nowy EditText w wewnętrznej klasie / metodzie i ponownie użyj findViewById (). Ponadto nie stwierdziłem, że muszę wiedzieć, który tekst EditText w formularzu był aktywny. Mógłbym po prostu wybrać dowolnie jeden i użyć go. Tak jak to:

    EditText myEditText= (EditText) findViewById(R.id.anyEditTextInForm);  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

3
Witamy w Stack Overflow! To naprawdę komentarz, a nie odpowiedź. Z nieco większym przedstawicielem będziesz mógł publikować komentarze .
— Jack

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

To rozwiązanie upewnij się, że ukrywa klawiaturę, a także nic nie rób, jeśli nie zostanie otwarta. Używa rozszerzenia, więc może być używany z dowolnej klasy właściciela kontekstu.


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

Korzystając z kontekstu widoku, możemy osiągnąć pożądany efekt za pomocą następujących metod rozszerzających w Kotlinie:

/**
 * 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
        )

Gdy już to zrobisz, zadzwoń:

editTextFoo.dismiss()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.