Android odrzuca klawiaturę

147

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

Manikandan
źródło
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);
DeRagan
źródło
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);
    }
}
user2167877
źródło
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);
    }
}
RPM
źródło
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);
Kandha
źródło
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()
Marchy
źródło
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);
Andy
źródło
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();
    }
}
androidmalin
źródło
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)
    }
}

Mahmoud Mabrok
źródło
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()
masterwok
źródło