Saya memiliki EditText
dan Button
dalam tata letak saya.
Setelah menulis di bidang edit dan mengklik Button
, saya ingin menyembunyikan keyboard virtual. Saya berasumsi bahwa ini adalah potongan kode yang sederhana, tetapi di mana saya dapat menemukan contohnya?
Saat menyentuh di luar keyboard.
Jawaban:
Untuk membantu memperjelas kegilaan ini, saya ingin memulai dengan meminta maaf atas nama semua pengguna Android atas perlakuan konyol Google terhadap keyboard lunak. Alasan ada begitu banyak jawaban, masing-masing berbeda, untuk pertanyaan sederhana yang sama adalah karena API ini, seperti banyak lainnya di Android, dirancang dengan mengerikan. Saya tidak bisa memikirkan cara yang sopan untuk menyatakannya.
Saya ingin menyembunyikan keyboard. Saya berharap untuk memberikan Android dengan pernyataan berikut:
Keyboard.hide()
. Tamat. Terima kasih banyak. Tapi Android punya masalah. Anda harus menggunakanInputMethodManager
untuk menyembunyikan keyboard. OKE, baiklah, ini adalah API Android untuk keyboard. TAPI! Anda harus memilikiContext
untuk mendapatkan akses ke IMM. Sekarang kita punya masalah. Saya mungkin ingin menyembunyikan keyboard dari kelas statis atau utilitas yang tidak memiliki kegunaan atau kebutuhan apa punContext
. atau Dan JAUH lebih buruk, IMM mengharuskan Anda menentukan apaView
(atau bahkan lebih buruk, apaWindow
) yang ingin Anda sembunyikan dari keyboard.Inilah yang membuat menyembunyikan keyboard sangat menantang. Dear Google: Ketika saya mencari resep kue, tidak ada
RecipeProvider
di Bumi yang akan menolak untuk memberi saya resep kecuali saya pertama kali menjawab SIAPA kue itu akan dimakan oleh DAN di mana ia akan dimakan !!Kisah sedih ini berakhir dengan kebenaran yang buruk: untuk menyembunyikan keyboard Android, Anda akan diminta untuk memberikan 2 bentuk identifikasi: a
Context
dan salah satuView
atau aWindow
.Saya telah membuat metode utilitas statis yang dapat melakukan pekerjaan SANGAT solid, asalkan Anda menyebutnya dari sebuah
Activity
.Ketahuilah bahwa metode utilitas ini HANYA berfungsi saat dipanggil dari
Activity
! Metode di atas memanggilgetCurrentFocus
targetActivity
untuk mengambil token jendela yang tepat.Tapi misalkan Anda ingin menyembunyikan keyboard dari
EditText
host diDialogFragment
? Anda tidak dapat menggunakan metode di atas untuk itu:Ini tidak akan berhasil karena Anda akan memberikan referensi ke
Fragment
host 'sActivity
, yang tidak akan memiliki kontrol terfokus saatFragment
ditampilkan! Wow! Jadi, untuk menyembunyikan keyboard dari fragmen, saya beralih ke level yang lebih rendah, lebih umum, dan lebih jelek:Di bawah ini adalah beberapa informasi tambahan yang diperoleh dari semakin banyak waktu yang terbuang mengejar solusi ini:
Tentang windowSoftInputMode
Masih ada hal lain yang perlu diperhatikan. Secara default, Android akan secara otomatis menetapkan fokus awal ke
EditText
kontrol pertama atau yang dapat fokus diActivity
. Secara alami, InputMethod (biasanya keyboard lunak) akan merespons acara fokus dengan menunjukkan dirinya. ThewindowSoftInputMode
atribut dalamAndroidManifest.xml
, ketika diatur kestateAlwaysHidden
, menginstruksikan keyboard untuk mengabaikan fokus awal ini secara otomatis ditugaskan.Hampir tidak dapat dipercaya, tampaknya tidak melakukan apa pun untuk mencegah keyboard membuka ketika Anda menyentuh kontrol (kecuali
focusable="false"
dan / ataufocusableInTouchMode="false"
ditugaskan ke kontrol). Rupanya, pengaturan windowSoftInputMode hanya berlaku untuk acara fokus otomatis, bukan untuk memfokuskan acara yang dipicu oleh acara sentuh.Oleh karena itu,
stateAlwaysHidden
memang SANGAT buruk namanya. Mungkin seharusnya disebutignoreInitialFocus
sebaliknya.Semoga ini membantu.
PEMBARUAN: Lebih banyak cara untuk mendapatkan token jendela
Jika tidak ada tampilan terfokus (mis. Bisa terjadi jika Anda baru saja mengubah fragmen), ada tampilan lain yang akan menyediakan token jendela yang bermanfaat.
Ini adalah alternatif untuk kode di atas.
if (view == null) view = new View(activity);
Ini tidak merujuk secara eksplisit ke aktivitas Anda.Di dalam kelas fragmen:
Diberikan fragmen
fragment
sebagai parameter:Mulai dari badan konten Anda:
UPDATE 2: Hapus fokus untuk menghindari menampilkan keyboard lagi jika Anda membuka aplikasi dari latar belakang
Tambahkan baris ini ke akhir metode:
view.clearFocus();
sumber
Fragment
tampaknya Anda dapat menggunakangetActivity().getWindow().getDecorView()
Keyboard.hide();
utilitas ituAnda dapat memaksa Android untuk menyembunyikan keyboard virtual menggunakan InputMethodManager , memanggil
hideSoftInputFromWindow
, meneruskan token jendela yang berisi tampilan fokus Anda.Ini akan memaksa keyboard disembunyikan di semua situasi. Dalam beberapa kasus, Anda akan ingin
InputMethodManager.HIDE_IMPLICIT_ONLY
memasukkan sebagai parameter kedua untuk memastikan Anda hanya menyembunyikan keyboard ketika pengguna tidak secara paksa memaksanya untuk muncul (dengan menahan menu).Catatan: Jika Anda ingin melakukan ini di Kotlin, gunakan:
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
Sintaks Kotlin
sumber
editText.clearFocus()
kemudianInputMethodManager.HIDE_IMPLICIT_ONLY
bekerja pada4.1
View focused = getCurrentFocus()
untuk mendapatkan apa yang jelas - jelas merupakan tampilan fokus, panggilanfocused.clearFocus()
, dan kemudianinputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)
(dengan flag yang jelas).Juga berguna untuk menyembunyikan soft-keyboard adalah:
Ini dapat digunakan untuk menekan keyboard lunak hingga pengguna benar-benar menyentuh tampilan editText.
sumber
Saya punya satu solusi lagi untuk menyembunyikan keyboard:
Di sini lewat
HIDE_IMPLICIT_ONLY
di posisishowFlag
dan0
di posisihiddenFlag
. Ini akan menutup paksa Keyboard lunak.sumber
Solusi Meier juga bekerja untuk saya. Dalam kasus saya, tingkat teratas Aplikasi saya adalah tabHost dan saya ingin menyembunyikan kata kunci saat berpindah tab - saya mendapatkan token jendela dari Tampilan tabHost.
sumber
Silakan coba kode di bawah ini
onCreate()
sumber
editView.setInputType(InputType.TYPE_NULL);
Pembaruan: Saya tidak tahu mengapa solusi ini tidak berfungsi lagi (saya baru saja menguji pada Android 23). Silakan gunakan solusi Saurabh Pareek sebagai gantinya. Ini dia:
Jawaban lama:
sumber
I don't know why this solution is not work any more
- Karena itu Android , semuanya akan dapat berubah, mungkin sebagian dari desain yang buruk ... Kami menulis dengan ceroboh, lalu kami mencoret semua dan menulis ulang semuanya.sumber
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
.input.setInputType(0);
dari kode ini. Itu mengubah perilaku keyboard daninputType
untukEditText
.Jika semua jawaban lain di sini tidak bekerja untuk Anda seperti yang Anda inginkan, ada cara lain untuk mengontrol keyboard secara manual.
Buat fungsi dengan yang akan mengelola beberapa
EditText
properti:Kemudian, pastikan bahwa pada Fokus
EditText
Anda membuka / menutup keyboard:Sekarang, kapan pun Anda ingin membuka keyboard, panggil secara manual:
Dan untuk panggilan penutupan:
sumber
Saurabh Pareek memiliki jawaban terbaik sejauh ini.
Mungkin juga menggunakan bendera yang benar.
Contoh penggunaan nyata
sumber
fragment.getActivity().getSystemService();
dari pencarian, di sini saya menemukan jawaban yang cocok untuk saya
sumber
Jawaban singkatnya
Dalam Anda
OnClick
pendengar memanggilonEditorAction
dariEditText
denganIME_ACTION_DONE
Drill-down
Saya merasa metode ini lebih baik, lebih sederhana dan lebih selaras dengan pola desain Android. Dalam contoh sederhana di atas (dan biasanya dalam sebagian besar kasus umum) Anda akan memiliki
EditText
fokus yang memiliki / dan juga biasanya adalah orang yang memohon keyboard di tempat pertama (itu pasti dapat memanggilnya dalam banyak skenario umum). Dengan cara yang sama, itu harus menjadi orang yang melepaskan keyboard, biasanya yang dapat dilakukan olehImeAction
. Lihat saja bagaimanaEditText
denganandroid:imeOptions="actionDone"
berperilaku, Anda ingin mencapai perilaku yang sama dengan cara yang sama.Periksa jawaban terkait ini
sumber
Ini seharusnya bekerja:
sumber
hide()
danshow()
metode untuk memiliki lebih banyak kontrol atas kapan harus ditampilkan dan kapan tidak. Bekerja untuk saya, saya juga melakukannya :) Saya akan mengedit contohKeyBoard.toggle(fragment.getActivity())
Fragment
, seperti berkomentar. Pelajari cara menggunakan metode tolong dan kemudian kembali. Anda membingungkan orang-orang dengan balasan konyol AndaSaya menggunakan keyboard khusus untuk memasukkan nomor Hex sehingga saya tidak dapat menampilkan keyboard IMM ...
Di v3.2.4_r1
setSoftInputShownOnFocus(boolean show)
ditambahkan untuk mengontrol cuaca atau tidak untuk menampilkan keyboard ketika TextView mendapatkan fokus, tetapi masih tersembunyi sehingga refleksi harus digunakan:Untuk versi yang lebih lama, saya mendapat hasil yang sangat baik (tetapi jauh dari sempurna) dengan
OnGlobalLayoutListener
, ditambah dengan bantuan dariViewTreeObserver
dari tampilan root saya dan kemudian memeriksa apakah keyboard ditampilkan seperti ini:Solusi terakhir ini dapat menampilkan keyboard untuk sepersekian detik dan mengacaukan pegangan pemilihan.
Ketika di keyboard memasuki layar penuh, onGlobalLayout tidak dipanggil. Untuk menghindarinya, gunakan TextView # setImeOptions (int) atau dalam deklarasi TextView XML:
Pembaruan: Baru saja menemukan dialog yang digunakan untuk tidak pernah menampilkan keyboard dan berfungsi di semua versi:
sumber
sumber
Saya telah menghabiskan lebih dari dua hari mengerjakan semua solusi yang diposting di utas dan menemukan mereka kurang dalam satu atau lain cara. Persyaratan persis saya adalah memiliki tombol yang akan menampilkan keandalan 100% atau menyembunyikan keyboard layar. Ketika keyboard dalam keadaan tersembunyi tidak seharusnya muncul kembali, apa pun bidang input yang diklik pengguna. Saat berada dalam kondisi terlihat, keyboard tidak boleh hilang apa pun tombol yang diklik pengguna. Ini perlu bekerja di Android 2.2+ hingga perangkat terbaru.
Anda dapat melihat implementasi ini berfungsi di RPN bersih aplikasi saya .
Setelah menguji banyak jawaban yang disarankan pada sejumlah ponsel yang berbeda (termasuk perangkat froyo dan gingerbread), menjadi jelas bahwa aplikasi android dapat diandalkan:
Bagi saya, menyembunyikan sementara keyboard tidak cukup. Pada beberapa perangkat ini akan muncul kembali segera setelah bidang teks baru difokuskan. Karena aplikasi saya menggunakan beberapa bidang teks pada satu halaman, memfokuskan bidang teks baru akan menyebabkan keyboard yang tersembunyi muncul kembali.
Sayangnya item 2 dan 3 dalam daftar hanya dapat diandalkan ketika suatu aktivitas sedang dimulai. Setelah aktivitas terlihat, Anda tidak dapat menyembunyikan atau menampilkan keyboard secara permanen. Caranya adalah dengan benar-benar memulai kembali aktivitas Anda ketika pengguna menekan tombol sakelar keyboard. Dalam aplikasi saya ketika pengguna menekan tombol toggle keyboard, kode berikut berjalan:
Hal ini menyebabkan aktivitas saat ini disimpan dalam Bundle, dan kemudian aktivitas dimulai, melewati boolean yang menunjukkan apakah keyboard harus ditampilkan atau disembunyikan.
Di dalam metode onCreate kode berikut dijalankan:
Jika keyboard lunak ditampilkan, maka InputMethodManager diperintahkan untuk menampilkan keyboard dan jendela diperintahkan untuk membuat input lunak selalu terlihat. Jika keyboard lunak harus disembunyikan maka WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM diatur.
Pendekatan ini bekerja dengan andal pada semua perangkat yang telah saya uji - dari ponsel HTC 4 tahun yang menjalankan Android 2.2 hingga nexus 7 yang menjalankan 4.2.2. Satu-satunya kelemahan dengan pendekatan ini adalah Anda harus berhati-hati dalam menangani tombol kembali. Karena aplikasi saya pada dasarnya hanya memiliki satu layar (dengan kalkulator), saya dapat menimpa onBackPressed () dan kembali ke layar beranda perangkat.
sumber
Sebagai alternatif untuk solusi all around ini , jika Anda ingin menutup soft keyboard dari mana saja tanpa memiliki referensi ke bidang (EditText) yang digunakan untuk membuka keyboard, tetapi tetap ingin melakukannya jika bidang itu difokuskan, Anda dapat menggunakan ini (dari Aktivitas):
sumber
Berkat jawaban SO ini , saya memperoleh yang berikut, yang dalam kasus saya, berfungsi dengan baik ketika menelusuri fragmen ViewPager ...
sumber
Jawaban di atas berfungsi untuk skenario yang berbeda, tetapi Jika Anda ingin menyembunyikan keyboard di dalam tampilan dan berjuang untuk mendapatkan konteks yang tepat coba ini:
dan untuk mendapatkan konteksnya, ambil dari konstruktor :)
sumber
Jika Anda ingin menutup keyboard lunak selama tes unit atau fungsional, Anda dapat melakukannya dengan mengeklik "tombol kembali" dari pengujian Anda:
Saya memasukkan "tombol kembali" ke dalam tanda kutip, karena hal di atas tidak memicu
onBackPressed()
untuk Aktivitas yang dimaksud. Itu hanya menutup keyboard.Pastikan untuk berhenti sebentar sebelum melanjutkan, karena perlu sedikit waktu untuk menutup tombol kembali, jadi klik berikutnya untuk Tampilan, dll., Tidak akan terdaftar sampai setelah jeda singkat (1 detik cukup lama untuk ).
sumber
Inilah cara Anda melakukannya di Mono untuk Android (AKA MonoDroid)
sumber
searchbox
di cuplikan?Ini bekerja untuk saya untuk semua perilaku keyboard yang aneh
sumber
Tambahkan ke aktivitas Anda
android:windowSoftInputMode="stateHidden"
di file Manifest. Contoh:sumber
Sederhana dan Mudah digunakan, panggil saja hideKeyboardFrom (YourActivity.this); untuk menyembunyikan keyboard
sumber
Cukup gunakan kode yang dioptimalkan ini dalam aktivitas Anda:
sumber
setelah panggilan di onTouchListener:
sumber
Gunakan ini
sumber
Untuk kasus saya, saya menggunakan SearchView di actionbar. Setelah pengguna melakukan pencarian, keyboard akan terbuka lagi.
Menggunakan InputMethodManager tidak menutup keyboard. Saya harus mengosongkan fokus dan menetapkan fokus pada tampilan pencarian ke false:
sumber
clearFocus()
di halaman API Android, jadi ini tidak bekerja untuk saya, tetapi solusi lain melakukannya (lihat jawaban saya di bawah).Saya punya kasing, di mana saya
EditText
dapat ditemukan juga dalamAlertDialog
, jadi keyboard harus ditutup pada pemberhentian. Kode berikut tampaknya berfungsi di mana saja:sumber
Saya hampir mencoba semua jawaban ini, saya punya beberapa masalah acak terutama dengan samsung galaxy s5.
Yang akhirnya saya lakukan adalah memaksa acara dan sembunyikan, dan itu bekerja dengan sempurna:
sumber