Android mengabaikan keyboard

147

Bagaimana cara saya mengabaikan keyboard saat tombol ditekan?

Manikandan
sumber
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);
DeRagan
sumber
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);
    }
}
pengguna2167877
sumber
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);
    }
}
RPM
sumber
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);
Kandha
sumber
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()
Marchy
sumber
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);
Andy
sumber
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();
    }
}
androidmalin
sumber
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)
    }
}

Mahmoud Mabrok
sumber
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()
masterwok
sumber