Apakah ada cara di Android untuk mendeteksi apakah perangkat lunak (alias "lunak") keyboard terlihat di layar?
android
keyboard
android-softkeyboard
andreea
sumber
sumber
Jawaban:
Tidak ada cara langsung - lihat http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a di mana Dianne Hackborn dari tim Android telah menjawab. Namun, Anda dapat mendeteksinya secara tidak langsung dengan memeriksa apakah ukuran jendela berubah di #onMeasure. Lihat Bagaimana memeriksa visibilitas papan ketik perangkat lunak di Android? .
sumber
Ini bekerja untuk saya. Mungkin ini selalu merupakan cara terbaik untuk semua versi .
Akan lebih efektif untuk membuat properti visibilitas keyboard dan mengamati perubahan ini tertunda karena metode onGlobalLayout memanggil berkali-kali. Juga baik untuk memeriksa rotasi perangkat dan
windowSoftInputMode
tidakadjustNothing
.sumber
contentView
dinyatakan?coba ini:
sumber
Saya membuat kelas sederhana yang dapat digunakan untuk ini: https://github.com/ravindu1024/android-keyboardlistener . Cukup salin ke proyek Anda dan gunakan sebagai berikut:
sumber
Sangat mudah
1. Letakkan id di tampilan root Anda
rootView
hanyalah tampilan yang menunjuk ke tampilan root saya dalam hal inirelative layout
:2. Inisialisasi tampilan root Anda di Aktivitas Anda:
RelativeLayout rootView = (RelativeLayout) findViewById(R.id.addresses_confirm_root_view);
3. Mendeteksi apakah keyboard dibuka atau ditutup dengan menggunakan
getViewTreeObserver()
sumber
1
. Tidak penting. Hanya ini yang harus kurang dari panjang keyboard sebenarnyaSaya menggunakan ini sebagai dasar: http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
Kemudian tulis metode ini:
Anda kemudian dapat menggunakan ini untuk menguji semua bidang (EditText, AutoCompleteTextView, dll) yang mungkin telah membuka papan tombol softkey:
Agaknya bukan solusi yang ideal, tetapi itu menyelesaikan pekerjaan.
sumber
Anda dapat menggunakan hasil panggilan balik dari showSoftInput () dan hideSoftInput () untuk memeriksa status keyboard. Rincian lengkap dan kode contoh di
http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
sumber
Anda dapat merujuk ke jawaban ini - https://stackoverflow.com/a/24105062/3629912
Itu bekerja untuk saya setiap saat.
Ini akan mengembalikan true, jika keyboard perangkat lunak terlihat.
sumber
Jadi setelah lama bermain-main dengan AccessibilityServices, insets jendela, deteksi ketinggian layar, dll, saya pikir saya menemukan cara untuk melakukan ini.
Penafian: menggunakan metode tersembunyi di Android, artinya mungkin tidak konsisten. Namun, dalam pengujian saya, sepertinya berhasil.
Metode ini adalah InputMethodManager # getInputMethodWindowVisibleHeight () , dan sudah ada sejak Lollipop (5.0).
Panggilan yang mengembalikan ketinggian, dalam piksel, dari keyboard saat ini. Secara teori, papan ketik tidak boleh setinggi 0 piksel, jadi saya melakukan pemeriksaan ketinggian sederhana (di Kotlin):
Saya menggunakan Android Hidden API untuk menghindari refleksi ketika saya memanggil metode tersembunyi (saya melakukan itu banyak untuk aplikasi yang saya kembangkan, yang sebagian besar merupakan aplikasi peretasan / penyetel), tetapi ini harus dimungkinkan dengan refleksi juga:
sumber
Ini jauh lebih rumit untuk persyaratan yang saya butuhkan. Semoga ini bisa membantu:
Di MainActivity:
Nilai boolean primitif default untuk mKeyboardStatus akan diinisialisasi ke false .
Kemudian periksa nilainya sebagai berikut, dan lakukan tindakan jika perlu:
sumber
Ini akan berfungsi jika Anda perlu memeriksa status keyboard:
Di mana
UiUtils.KEYBOARD_VISIBLE_THRESHOLD_DP
= 100 dan dip () adalah fungsi anko yang mengonversi dpToPx:sumber
Saya melakukan ini dengan menetapkan GlobalLayoutListener, sebagai berikut:
sumber
Coba kode ini benar-benar berfungsi jika KeyboardShown ditampilkan, maka fungsi ini mengembalikan nilai sebenarnya ....
sumber
Dalam kasus saya, saya hanya punya satu
EditText
untuk mengatur tata letak saya jadi saya datang dengan solusi ini . Ini bekerja dengan baik, pada dasarnya itu adalah kebiasaanEditText
yang mendengarkan fokus dan mengirimkan siaran lokal jika fokus berubah atau jika tombol kembali / selesai ditekan. Agar berhasil, Anda perlu menempatkan bonekaView
di tata letak Andaandroid:focusable="true"
danandroid:focusableInTouchMode="true"
karena ketika Anda meneleponclearFocus()
fokus akan dipindahkan ke tampilan fokus pertama. Contoh tampilan dummy:Info tambahan
Solusi yang mendeteksi perbedaan dalam perubahan tata letak tidak bekerja dengan baik karena sangat tergantung pada kepadatan layar, karena 100px bisa banyak di perangkat tertentu dan tidak ada di beberapa orang lain Anda bisa mendapatkan hasil positif palsu. Vendor yang berbeda juga memiliki keyboard yang berbeda.
sumber
Di Android Anda dapat mendeteksi melalui shell ADB. Saya menulis dan menggunakan metode ini:
sumber
sumber
Jawaban dari @iWantScala bagus tetapi tidak bekerja untuk saya
rootView.getRootView().getHeight()
selalu memiliki nilai yang samasalah satu caranya adalah dengan mendefinisikan dua vars
tambahkan pendengar global
lalu periksa
bekerja dengan baik
sumber
Akhirnya ada cara langsung mulai dari Android R berdasarkan Kotlin sekarang.
sumber
Saya punya masalah serupa. Saya perlu bereaksi terhadap tombol Enter di layar (yang menyembunyikan keyboard). Dalam hal ini Anda dapat berlangganan OnEditorAction dari tampilan teks dengan keyboard yang terbuka - jika Anda memiliki beberapa kotak yang dapat diedit, maka berlanggananlah semuanya.
Di Aktivitas Anda, Anda memiliki kontrol penuh atas keyboard, jadi Anda tidak akan menghadapi masalah apakah keyboard dibuka atau tidak, jika Anda mendengarkan semua acara pembukaan dan penutupan.
sumber
Ada metode langsung untuk mengetahuinya. Dan, itu tidak membutuhkan perubahan tata letak.
Jadi ini berfungsi dalam mode layar penuh imersif juga.
Tapi, sayangnya, itu tidak berfungsi di semua perangkat. Jadi, Anda harus mengujinya dengan perangkat Anda.
Caranya adalah Anda mencoba menyembunyikan atau menampilkan keyboard lunak dan menangkap hasil dari percobaan itu.
Jika berfungsi dengan benar maka keyboard tidak benar-benar ditampilkan atau disembunyikan. Kami hanya meminta negara.
Agar tetap terkini, Anda cukup mengulangi operasi ini, misalnya setiap 200 milidetik, menggunakan Handler.
Implementasi di bawah ini hanya melakukan satu pemeriksaan.
Jika Anda melakukan beberapa pemeriksaan, maka Anda harus mengaktifkan semua tes (_keyboardVisible).
sumber
Berikut adalah solusi untuk mengetahui apakah papan tombol softkey terlihat.
Beberapa keyboard populer memiliki kata kunci tertentu di Nama kelasnya:
Dari ActivityManager.RunningServiceInfo, periksa pola di atas di ClassNames. Juga, ActivityManager.RunningServiceInfo clientPackage = android, menunjukkan bahwa keyboard terikat ke sistem.
Informasi yang disebutkan di atas dapat dikombinasikan untuk cara yang ketat untuk mengetahui apakah keyboard lunak terlihat.
sumber
Seperti yang Anda ketahui, papan ketik Perangkat Lunak android hanya akan terlihat bila ada kemungkinan pengetikan. Dengan kata lain, Keyboard hanya dapat terlihat bila EditText terfokus. itu berarti Anda bisa mendapatkan cuaca Keyboard terlihat atau tidak dengan menggunakan OnFocusChangeListener .
Sekarang Anda dapat menggunakan variabel isKeyBoardVisible di mana saja di kelas untuk mendapatkan cuaca keyboard Terbuka atau Tidak. Itu bekerja dengan baik untuk saya.
Catatan: Proses ini tidak berfungsi ketika Keyboard dibuka secara terprogram menggunakan InputMethodManager karena itu tidak memanggil OnFocusChangeListener.
sumber
Saya mengonversi jawaban ke kotlin, semoga ini membantu pengguna kotlin.
sumber
Ini bekerja dengan menyesuaikan Tidak ada bendera aktivitas dan siklus hidup yang digunakan. Juga dengan Kotlin:
Metode yang berguna untuk menjaga tampilan selalu di atas keyboard
Di mana getFullViewBounds
Di mana getFullScreenSize
Di mana updateMargin
sumber
Saya melakukan ini sebagai berikut, tetapi hanya relevan jika tujuan Anda adalah untuk menutup / membuka keyboad.
tutup contoh: (memeriksa apakah keyboard sudah ditutup, jika tidak - menutup)
sumber
a mungkin menggunakan:
sumber
Saya menulis sampel .
Repositori ini dapat membantu mendeteksi status keyboard tanpa asumsi bahwa "keyboard harus lebih dari X bagian layar"
sumber
Jika Anda mendukung apis untuk AndroidR di aplikasi Anda, maka Anda dapat menggunakan metode di bawah ini.
Catatan: Ini hanya tersedia untuk AndroidR dan versi Android di bawah ini perlu mengikuti beberapa jawaban lain atau saya akan memperbaruinya untuk itu.
sumber