Saya ingin mengubah tata letak berdasarkan apakah keyboard virtual ditampilkan atau tidak. Saya telah mencari API dan berbagai blog tetapi sepertinya tidak menemukan sesuatu yang bermanfaat.
Apa itu mungkin?
Terima kasih!
android
events
android-softkeyboard
Sander Versluys
sumber
sumber
Jawaban:
Catatan
Anda harus menangani sendiri perubahan konfigurasi.
http://developer.android.com/guide/topics/resources/runtime-changes.html#MenanganiTheChange
Sampel:
Kemudian cukup ubah visibilitas beberapa tampilan, perbarui bidang, dan ubah file tata letak Anda.
sumber
newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO
~ ChrisIni mungkin bukan solusi yang paling efektif. Tetapi ini bekerja untuk saya setiap kali ... Saya memanggil fungsi ini di mana pun saya perlu mendengarkan softKeyboard.
Catatan: Pendekatan ini akan menyebabkan masalah jika pengguna menggunakan keyboard mengambang.
sumber
android:windowSoftInputMode="adjustPan"
, atauadjustResize
dengan jendela layar penuh, karena tata letak tidak pernah diubah ukurannya.Jika Anda ingin menangani show / hide jendela keyboard IMM (virtual) dari Aktivitas Anda, Anda harus mensubklasifikasikan tata letak dan mengganti metode onMesure (sehingga Anda dapat menentukan lebar yang diukur dan tinggi yang diukur dari tata letak Anda). Setelah itu tetapkan tata letak subklas sebagai tampilan utama untuk Aktivitas Anda dengan setContentView (). Sekarang Anda akan dapat menangani acara IMM show / hide window. Jika ini terdengar rumit, sebenarnya tidak terlalu. Ini kodenya:
main.xml
Sekarang di dalam Activity Anda, deklarasikan subclass untuk layout Anda (main.xml)
Anda dapat melihat dari kode bahwa kami mengembang tata letak untuk Aktivitas kami di konstruktor subkelas
Dan sekarang hanya mengatur tampilan konten tata letak subclass untuk Aktivitas kami.
sumber
android:windowSoftInputMode="adjustPan"
, atauadjustResize
dengan jendela layar penuh, karena tata letak tidak pernah diubah ukurannya.Saya melakukan ini:
Tambahkan
OnKeyboardVisibilityListener
antarmuka.HomeActivity.java :
Semoga ini bisa membantu Anda.
sumber
Berdasarkan Kode dari Nebojsa Tomcic, saya telah mengembangkan RelativeLayout-Subclass berikut:
Ini berfungsi dengan baik ... Tandai, bahwa solusi ini hanya akan bekerja ketika Mode Input Lunak dari Aktivitas Anda diatur ke "WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE"
sumber
android:windowSoftInputMode="adjustPan"
, atauadjustResize
dengan jendela layar penuh, karena tata letak tidak pernah diubah ukurannya.Seperti jawaban @ amalBit, daftarkan pendengar ke tata letak global dan hitung perbedaan bagian bawah yang terlihat dectorView dan bagian bawah yang diusulkan, jika perbedaannya lebih besar dari nilai tertentu (tebak tinggi IME), kami pikir IME naik:
ambang ketinggian 100 adalah tinggi minimum IME yang dapat ditebak.
Ini berfungsi untuk AdjustPan dan AdjustResize.
sumber
Solusi Nebojsa hampir berhasil untuk saya. Ketika saya mengklik di dalam EditText multi-baris itu tahu keyboard ditampilkan, tetapi ketika saya mulai mengetik di dalam EditText, aktualHeight dan usulanHeight masih sama sehingga tidak tahu bahwa keyboard mereka masih ditampilkan. Saya membuat sedikit modifikasi untuk menyimpan ketinggian maksimal dan berfungsi dengan baik. Ini subclass yang direvisi:
sumber
Tidak yakin ada yang memposting ini. Menemukan solusi ini mudah digunakan! . Kelas SoftKeyboard ada di gist.github.com . Tetapi saat keyboard popup / sembunyikan event callback, kami membutuhkan penangan untuk melakukan hal-hal dengan benar di UI:
sumber
Saya mengatasi ini dengan mengesampingkan onKeyPreIme (int keyCode, acara KeyEvent) di EditText kustom saya.
sumber
Saya memiliki semacam peretasan untuk melakukan ini. Meskipun ada tampaknya tidak menjadi cara untuk mendeteksi ketika keyboard lunak telah ditampilkan atau disembunyikan, Anda dapat sebenarnya mendeteksi ketika sekitar yang akan ditampilkan atau disembunyikan dengan menetapkan
OnFocusChangeListener
padaEditText
yang Anda sedang mendengarkan.CATATAN: Satu hal yang perlu diperhatikan dengan peretasan ini adalah bahwa panggilan balik ini dipecat segera ketika
EditText
keuntungan atau kehilangan fokus. Ini akan benar-benar menyala tepat sebelum keyboard lunak muncul atau bersembunyi. Cara terbaik yang saya temukan untuk melakukan sesuatu setelah keyboard menunjukkan atau menyembunyikannya adalah dengan menggunakanHandler
dan menunda sesuatu ~ 400ms, seperti:sumber
OnFocusChangeListener
hanya memberi tahu apakahEditText
memiliki fokus setelah keadaan berubah. Tapi yangIME
mungkin disembunyikan ketikaEditText
sudah fokus, bagaimana mendeteksi kasus ini?Sander, saya yakin Anda mencoba menunjukkan tampilan diblokir oleh keyboard lunak. Coba ini http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html .
sumber
Saya telah memecahkan masalah pada textview baris tunggal kembali coding.
sumber
Anda juga dapat memeriksa lapisan bawah anak DecorView pertama. Ini akan diatur ke nilai non-nol saat keyboard ditampilkan.
sumber
Sembunyikan | Tampilkan acara untuk keyboard dapat didengarkan melalui peretasan sederhana di OnGlobalLayoutListener:
Di sini activityRootView adalah tampilan root Aktivitas Anda.
sumber
menggunakan viewTreeObserver untuk dengan mudah mendapatkan acara keyboard.
** layout_parent adalah tampilan Anda
edit_text.parent
sumber
Jawaban Nebojsa Tomcic tidak membantu saya. Saya miliki
RelativeLayout
denganTextView
danAutoCompleteTextView
di dalamnya. Saya perlu menggulirTextView
ke bawah ketika keyboard ditampilkan dan ketika itu disembunyikan. Untuk mencapai ini saya mengesampingkanonLayout
metode dan itu berfungsi dengan baik untuk saya.sumber