Android mengabaikan keyboard


147

Bagaimana cara saya mengabaikan keyboard saat tombol ditekan?


Jadikan EditText Focusable = False mengerjakan tugasnya. Apakah Anda ingin menonaktifkannya sepenuhnya?
st0le

Jawaban:


325

Anda ingin menonaktifkan atau mengabaikan Keyboard virtual?

Jika Anda ingin mengabaikannya, Anda dapat menggunakan baris kode berikut di tombol Anda pada acara klik

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

1
Dua masalah dengan ini .... satu adalah bahwa myEditText harus Final. Kedua adalah saya harus tahu kotak EditText mana yang memiliki fokus. Ada solusi untuk ini?
Ethan Allen

78
Untuk siapa pun yang tersandung di sini, Anda dapat menggunakan aktivitas (baik aktivitas yang Anda lakukan atau fragmen getActivity()) getCurrentFocus().getWindowToken()untuk argumen pertama hideSoftInputFromWindow(). Juga, lakukan dalam onPause()dan bukan onStop()jika Anda mencoba untuk menghilangkannya saat berganti kegiatan.
Drake Clarris

2
Jawaban ini, dikombinasikan dengan komentar di sini, benar-benar menyelesaikan masalah saya!
aveschini

9
Sungguh pendekatan yang jelek dan jelek untuk mengabaikan keyboard. Saya harap ada cara yang lebih bersih di masa depan untuk melakukan hal yang sederhana.
Subby

73

Solusi di atas tidak berfungsi untuk semua perangkat dan terlebih lagi menggunakan EditText sebagai parameter. Ini solusi saya, panggil saja metode sederhana ini:

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()menjadikan jawaban ini lebih baik daripada yang lain
user1506104

Solusi yang bagus ... dalam kasus yang jarang terjadi adalahAcceptingText () dapat mengembalikan false ketika keyboard masih ada di layar, misalnya klik menjauh dari EditText ke teks yang dapat dipilih tetapi tidak diedit di jendela yang sama.
Georgie

29

Ini solusi saya

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

Itu jika Anda tahu tampilan yang menyebabkan keyboard ditampilkan.
RPM

16

Anda juga dapat menggunakan kode ini pada acara klik tombol

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

13

Inilah solusi Kotlin (mencampur berbagai jawaban di utas)

Buat fungsi ekstensi (mungkin dalam kelas ViewHelpers umum)

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

Maka cukup konsumsi menggunakan:

// from activity
this.dismissKeyboard()

// from fragment
activity.dismissKeyboard()

5

Solusi pertama dengan InputMethodManager bekerja seperti juara bagi saya, getWindow (). Metode setSoftInputMode tidak di android 4.0.3 HTC Amaze.

@ Ethan Allen, saya tidak perlu membuat teks edit menjadi final. Mungkin Anda menggunakan kelas dalam EditText yang Anda nyatakan metode yang mengandung? Anda bisa menjadikan EditText sebagai variabel kelas dari Kegiatan. Atau cukup deklarasikan EditText baru di dalam kelas / metode dalam dan gunakan findViewById () lagi. Juga, saya tidak menemukan bahwa saya perlu tahu yang EditText dalam formulir memiliki fokus. Saya hanya bisa memilih satu secara sewenang-wenang dan menggunakannya. Seperti itu:

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

3
Selamat Datang di Stack Overflow! Ini benar-benar komentar, bukan jawaban. Dengan sedikit rep, Anda dapat memposting komentar .
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

Solusi ini pastikan menyembunyikan keyboard juga tidak melakukan apa-apa jika tidak dibuka. Ini menggunakan ekstensi sehingga dapat digunakan dari kelas Pemilik Konteks.


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

Dengan menggunakan konteks tampilan, kita dapat mencapai hasil yang diinginkan dengan metode ekstensi berikut di Kotlin:

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

Setelah ini tersedia, telepon saja:

editTextFoo.dismiss()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.