Android klavyeyi kapat


149

Bir düğmeye basıldığında klavyeyi nasıl kapatırım?


EditText'i Focusable yapın = False işi yapar. Tamamen devre dışı bırakmak istiyor musunuz?
— st0le

Yanıtlar:


328

Sanal Klavyeyi devre dışı bırakmak mı yoksa kaldırmak mı istiyorsunuz?

Sadece reddetmek istiyorsanız, düğmenizdeki aşağıdaki kod satırlarını kullanabilirsiniz.

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

1
Bununla ilgili iki sorun .... Biri, myEditText'in Final olması gerektiğidir. İkincisi, hangi EditText kutusunun odakta olduğunu bilmem gerektiğidir. Buna herhangi bir çözüm var mı?
— Ethan Allen

79
Burada tökezleyen herkes için, ilk argüman için aktivitenin (içinde bulunduğunuz aktivite veya fragmanlar getActivity()) getCurrentFocus().getWindowToken()kullanabilirsiniz hideSoftInputFromWindow(). Ayrıca, etkinlikleri değiştirirken gitmesini sağlamaya çalışıyorsanız onPause()değil, içinde yapın onStop().
— Drake Clarris

2
Buradaki yorumla birleştirilen bu cevap, sorunumu tamamen çözdü!
— aveschini

9
Bir klavyeyi reddetmek için ne kadar çirkin, çirkin bir yaklaşım. Umarım gelecekte bu kadar basit bir şey yapmanın daha temiz bir yolu vardır.
— Subby

73

Yukarıdaki çözüm tüm cihazlar için çalışmıyor ve ayrıca bir parametre olarak EditText kullanıyor. Bu benim çözümüm, sadece şu basit yöntemi çağırın:

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()bu yanıtı diğerlerinden daha iyi yaptı
— user1506104

İyi çözüm ... nadir durumlarda isAcceptingText (), klavye hala ekrandayken yanlış döndürebilir, örneğin EditText'ten aynı pencerede seçilebilen ancak düzenlenemeyen metne tıklayın.
— Georgie

30

Bu benim çözümüm

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

Yani, klavyenin gösterilmesine neden olan görünümü biliyorsanız.
— RPM

16

bu kodu düğme tıklama olayında da kullanabilirsiniz

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

13

İşte bir Kotlin çözümü (çeşitli yanıtları ileti dizisinde karıştırın)

Bir uzantı işlevi oluşturun (muhtemelen ortak bir ViewHelpers sınıfında)

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

O zaman şunu kullanarak tüketin:

// from activity
this.dismissKeyboard()

// from fragment
activity.dismissKeyboard()

5

InputMethodManager ile ilk çözüm benim için bir şampiyon gibi çalıştı, getWindow (). SetSoftInputMode yöntemi android 4.0.3 HTC Amaze'de yoktu.

@Ethan Allen, düzenleme metnini son haline getirmeme gerek yoktu. Belki de içeren yöntemi bildirdiğiniz bir EditText iç sınıfı kullanıyorsunuzdur? EditText'i Aktivitenin bir sınıf değişkeni yapabilirsiniz. Veya sadece iç sınıf / yöntem içinde yeni bir EditText bildirin ve findViewById () öğesini tekrar kullanın. Ayrıca, formdaki hangi EditText'in odaklandığını bilmem gerektiğini bulamadım. Sadece keyfi olarak seçip kullanabilirim. Şöyle:

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

3
Stack Overflow'a hoş geldiniz! Bu gerçekten bir yorum, cevap değil. Biraz daha tekrarla, yorum gönderebileceksiniz .
— 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

Bu Çözüm, klavyeyi gizlediğinden emin olun, açılmazsa hiçbir şey yapmayın. Uzantı kullanır, böylece herhangi bir Bağlam Sahibi sınıfından kullanılabilir.


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

Görünüm bağlamını kullanarak Kotlin'de aşağıdaki genişletme yöntemleri ile istenen sonucu elde edebiliriz:

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

Bunlar yerleştirildikten sonra şu numarayı arayın:

editTextFoo.dismiss()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.