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:
privatevoid hideSoftKeyBoard(){InputMethodManager imm =(InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);if(imm.isAcceptingText()){// verify if the soft keyboard is open
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);}}
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.
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 )asInputMethodManagerif( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow(this.currentFocus.windowToken,/*flags:*/0)}
Maka cukup konsumsi menggunakan:
// from activitythis.dismissKeyboard()// from fragment
activity.dismissKeyboard()
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:
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)asInputMethodManager}
val windowHeightMethod =InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm)asIntif(height >0){
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,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)asInputMethodManager}/**
* Dismiss soft input (keyboard) from the window using a [View] context.
*/
fun View.dismissKeyboard()= context
.getInputMethodManager().hideSoftInputFromWindow(
windowToken
,0)
Jawaban:
Anda ingin menonaktifkan atau mengabaikan Keyboard virtual?
Jika Anda ingin mengabaikannya, Anda dapat menggunakan baris kode berikut di tombol Anda pada acara klik
sumber
getActivity()
)getCurrentFocus().getWindowToken()
untuk argumen pertamahideSoftInputFromWindow()
. Juga, lakukan dalamonPause()
dan bukanonStop()
jika Anda mencoba untuk menghilangkannya saat berganti kegiatan.Solusi di atas tidak berfungsi untuk semua perangkat dan terlebih lagi menggunakan EditText sebagai parameter. Ini solusi saya, panggil saja metode sederhana ini:
sumber
isAcceptingText()
menjadikan jawaban ini lebih baik daripada yang lainIni solusi saya
sumber
Anda juga dapat menggunakan kode ini pada acara klik tombol
sumber
Inilah solusi Kotlin (mencampur berbagai jawaban di utas)
Buat fungsi ekstensi (mungkin dalam kelas ViewHelpers umum)
Maka cukup konsumsi menggunakan:
sumber
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:
sumber
sumber
Solusi ini pastikan menyembunyikan keyboard juga tidak melakukan apa-apa jika tidak dibuka. Ini menggunakan ekstensi sehingga dapat digunakan dari kelas Pemilik Konteks.
sumber
Dengan menggunakan konteks tampilan, kita dapat mencapai hasil yang diinginkan dengan metode ekstensi berikut di Kotlin:
Setelah ini tersedia, telepon saja:
sumber