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.