Saya tidak mengerti apa yang ambigu / kabur / tidak lengkap dalam pertanyaan ini? Saya mendapatkan peringatan ini di logcat saya saat menjalankan aplikasi saya, saya ingin tahu alasan peringatan ini.
pankajagarwal
2
Saya juga melihat ini dalam aplikasi saya yang sedang saya kembangkan dan saya tidak tahu dari mana asalnya atau mengapa. Jika ada yang tahu, silakan kirim komentar. Ini sebenarnya menunjukkan banyak peringatan berbeda selain "getExtractedText". Saya juga melihat: "beginBatchEdit", "endBatchEdit", "getTextBeforeCursor" dan banyak lagi.
rentang
1
adalah moderator yang melihat pertanyaan ini. Jika tidak maka mereka harus melakukannya karena jika mereka masih percaya pertanyaan ini sebagai kabur dan tidak jelas bahkan setelah 14 upvotes maka saya tidak tahu harus berkata apa
pankajagarwal
Saya setuju, ini adalah masalah yang juga harus saya tangani. Saya tidak tahu penyebabnya.
JonWillis
3
Kode apa yang Anda miliki yang menyebabkan kesalahan ini?
Bill the Lizard
Jawaban:
44
Saya mengalami masalah serupa. Logcat saya:
W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextAfterCursor on inactive InputConnection...
I/Choreographer(20010):Skipped30 frames!The application may be doing too much work on its main thread.
Situasi saya: Saya memiliki EditText untuk melihat tipe pengguna. EditText dihapus ketika pengguna menekan tombol. Banyak entri InputConnection yang tidak aktif mengalir ketika saya dengan cepat menekan tombol.
Ex:
editText.setText(null);
Baris terakhir di logcat saya di atas memberikan indikasi yang bagus tentang apa yang terjadi. Benar saja, InputConnection kewalahan oleh permintaan untuk menghapus teks. Saya mencoba memodifikasi kode untuk memeriksa panjang teks sebelum mencoba menghapusnya:
if(editText.length()>0){
editText.setText(null);}
Ini membantu mengurangi masalah karena menekan tombol dengan cepat tidak lagi menyebabkan aliran peringatan IInputConnectionWrapper. Namun ini masih rentan terhadap masalah ketika pengguna dengan cepat bergantian antara mengetik sesuatu dan menekan tombol atau menekan tombol ketika aplikasi berada di bawah beban yang cukup, dll.
Untungnya, saya menemukan cara lain untuk menghapus teks: Editable.clear () . Dengan ini saya tidak mendapat peringatan sama sekali:
Perhatikan bahwa jika Anda ingin menghapus semua status input dan bukan hanya teks (autotext, autocap, multitap, undo), Anda dapat menggunakan TextKeyListener.clear (Editable e) .
Saya juga mendapatkan peringatan IInputConnectionWrapper dan aplikasi saya hampir ANR, metode clear () berfungsi untuk saya ... bug super aneh, sebelum saya mengatur setText ("");
kotak
17
Memperbarui:
Alasan saya mendapatkan peringatan InputConnection bukan karena di mana saya mengatur teks (yaitu, dalam onTextChangedpanggilan balik, atau afterTextChanged) - itu karena saya menggunakansetText .
Catatan: Saya masih melakukan panggilan di afterTextChangedcallback, meskipun itu berfungsi tanpa peringatan dariontextChanged juga.
Jawaban sebelumnya:
Saya mendapatkan pesan yang sama di logcat juga, meskipun skenario saya sedikit berbeda. Saya ingin membaca setiap karakter yang masuk ke EditText (atau terdiri karakter / teks disisipkan), dan kemudian reset EditText yang bersangkutan ke string inisialisasi default.
Bagian teks yang jelas berfungsi sesuai solusi Johnson di atas. Namun, mengatur ulang teks bermasalah, dan saya akan mendapatkan peringatan koneksi input.
Awalnya, saya onTextChanged(CharSequence s, ...)didefinisikan sebagai berikut:
@Overridepublicvoid onTextChanged(CharSequence s,int start,int before,int count){if(isResettingKeyboard)return;// ... do what needs to be done
resetKeyboardString();}publicvoid resetKeyboardString(){
isResettingKeyboard =true;
hiddenKeyboardText.getText().clear();
hiddenKeyboardText.setText(keyboardInitString);
hiddenKeyboardText.setSelection(defaultKeyboardCursorLocation);
isResettingKeyboard =false;}
Ketika onTextChanged(...)dipanggil, EditText dalam mode hanya baca. Saya tidak yakin apakah ini berarti kami tidak dapat melakukan lebih dari memanggilnya getText.clear()(setText(...) panggilan juga menghasilkan peringatan inputConnection).
Namun, panggilan balik afterTextChanged(Editable s)adalah tempat yang tepat untuk mengatur teks.
Saya punya masalah yang sama juga. Apa yang saya sadari adalah bahwa meskipun solusi Anda menghilangkan peringatan InputConnection, saya perhatikan bahwa afterTextChangedmetode ini diaktifkan hiddenKeyboardText.getText().clear();dan diaktifkan hiddenKeyboardText.append("some string");, dan fakta ini juga harus diperhitungkan. +1 dari saya!
Nick
@Tidak benar - penting untuk memastikan if (isResettingKeyboard) return;ada di atas ...
Antarmuka InputConnection adalah saluran komunikasi dari InputMethod kembali ke aplikasi yang menerima inputnya. Ini digunakan untuk melakukan hal-hal seperti membaca teks di sekitar kursor, memasukkan teks ke kotak teks, dan mengirim peristiwa kunci mentah ke aplikasi.
Selain itu, bacaan lebih lanjut menunjukkan
getExtractedText (): Metode ini mungkin gagal baik jika koneksi input menjadi tidak valid
(seperti prosesnya macet) atau klien terlalu lama untuk merespons dengan teks (diberikan beberapa detik untuk kembali) . Dalam kedua kasus tersebut, null dikembalikan.
Tampaknya juga memonitor perubahan pada teks tersebut, dan mengingatkan perubahan.
Untuk mengatasi masalah ini, Anda harus menjelajahi kueri basis data yang Anda buat, mungkin di sekitar listViews atau daftar dalam tata letak.
Jika Anda tidak memiliki pandangan, misalnya itu terjadi secara acak di latar belakang, maka saya akan menyarankan bahwa itu bukan masalah elemen UI, jadi abaikan bidang teks dan semacamnya. Ini bisa berupa layanan latar belakang yang menyimpan informasi dalam kursor atau meminta kursor.
Juga, apakah masalah muncul dari aplikasi Anda? atau mungkin milik orang lain yang baru saja Anda instal. Daftar jejak logCat lengkap. Seseorang mungkin mengenali masalah ini.
Saya akan menebak bahwa jika Anda belum menulis sesuatu yang spesifik tentang hal ini maka orang lain akan menerima pesan log, atau mungkin perpustakaan yang Anda gunakan?
terima kasih, saya memang membuat pertanyaan db tetapi anehnya peringatan ini tidak muncul ketika menjalankan aplikasi pada emulator, jadi itu mungkin sebenarnya disebabkan oleh beberapa aplikasi lain yang diinstal pada perangkat saya. Akan melihat ke arah ini
pankajagarwal
Saya pikir logCat terbaru menunjukkan kepada Anda pesan Anda berbeda dari aplikasi lain, difilter. Belum menggunakannya cukup cukup untuk mengkonfirmasi itu. Anda bisa membuat aplikasi kosong baru, dan menonton log kucing untuk melihat apakah kesalahan terjadi, yang akan menghilangkan aplikasi Anda. dari menjadi masalah.
Emile
@Frieza belum tentu aplikasi lain. Saya telah menambahkan ArrayAdapter dengan sqlite dan sekarang saya mendapatkan peringatan ini di telepon juga. Saya kira Anda tidak melihat kesalahan pada emulator karena sedang lambat dan ambang kinerja dinonaktifkan sebagai konsekuensinya.
alandarev
7
Saya mengalami masalah yang sama. Peringatan itu muncul ketika keyboard lunak diaktifkan di salah satu saya EditTextsdan aktivitas kehilangan fokus.
Apa yang saya lakukan adalah menyembunyikan keyboard di onPause ();
@Overrideprotectedvoid onPause(){// hide the keyboard in order to avoid getTextBeforeCursor on inactive InputConnectionInputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(myEditText.getWindowToken(),0);super.onPause();}
Peringatan itu akan muncul karena Objek dihapus dan Text Watcher masih diatur untuk melihatnya.
The Daftar Adapter dan Object digantikan, dan aku menebak Teks Watcher sedang mencari cara lain ketika itu terjadi.
Jadi peringatan berbunyi dan secara ajaib Pengamat Teks menemukan HeaderView dan Objek . Tapi itu kehilangan fokus dan mencatat peringatan itu.
Menggunakan
JOBSadapter.notifyDataSetChanged();
memperbaiki masalah ini.
TETAPI jika Anda memiliki Obyek di dalam Adaptor , dan Text Watcher terpasang ke Obyek di dalam Adaptor . Maka Anda mungkin perlu melakukan lebih banyak pekerjaan.
Coba hapus Pendengar dan pasang kembali setelah melakukan pekerjaan apa pun yang mungkin Anda lakukan.
Selain jawaban antoniom, pastikan bahwa tindakan lebih lanjut yang perlu dilakukan, benar-benar dilakukan setelah menyembunyikan keyboard, jadi jika Anda telah menyembunyikan keyboard seperti di bawah ini:
Masalah saya disebabkan oleh pengaturan visibilitas EditTextke GONEdan kemudian segera diatur keVISIBLE setiap kali pengguna mengetik karakter, karena saya menjalankan validasi pada input setiap kali teks berubah dan dalam beberapa kasus tampilan perlu disembunyikan.
Solusinya adalah untuk menghindari pengaturan visibilitas Tampilan atau Tata Letak ke PERGI antara UI atau pembaruan negara, karena EditTextdapat kehilangan fokus
Jawaban:
Saya mengalami masalah serupa. Logcat saya:
Situasi saya: Saya memiliki EditText untuk melihat tipe pengguna. EditText dihapus ketika pengguna menekan tombol. Banyak entri InputConnection yang tidak aktif mengalir ketika saya dengan cepat menekan tombol.
Ex:
Baris terakhir di logcat saya di atas memberikan indikasi yang bagus tentang apa yang terjadi. Benar saja, InputConnection kewalahan oleh permintaan untuk menghapus teks. Saya mencoba memodifikasi kode untuk memeriksa panjang teks sebelum mencoba menghapusnya:
Ini membantu mengurangi masalah karena menekan tombol dengan cepat tidak lagi menyebabkan aliran peringatan IInputConnectionWrapper. Namun ini masih rentan terhadap masalah ketika pengguna dengan cepat bergantian antara mengetik sesuatu dan menekan tombol atau menekan tombol ketika aplikasi berada di bawah beban yang cukup, dll.
Untungnya, saya menemukan cara lain untuk menghapus teks: Editable.clear () . Dengan ini saya tidak mendapat peringatan sama sekali:
Perhatikan bahwa jika Anda ingin menghapus semua status input dan bukan hanya teks (autotext, autocap, multitap, undo), Anda dapat menggunakan TextKeyListener.clear (Editable e) .
sumber
Memperbarui:
Alasan saya mendapatkan peringatan InputConnection bukan karena di mana saya mengatur teks (yaitu, dalam
onTextChanged
panggilan balik, atauafterTextChanged
) - itu karena saya menggunakansetText
.Saya mengatasi masalah ini dengan menelepon:
Catatan: Saya masih melakukan panggilan di
afterTextChanged
callback, meskipun itu berfungsi tanpa peringatan dariontextChanged
juga.Jawaban sebelumnya:
Saya mendapatkan pesan yang sama di logcat juga, meskipun skenario saya sedikit berbeda. Saya ingin membaca setiap karakter yang masuk ke EditText (atau terdiri karakter / teks disisipkan), dan kemudian reset EditText yang bersangkutan ke string inisialisasi default.
Bagian teks yang jelas berfungsi sesuai solusi Johnson di atas. Namun, mengatur ulang teks bermasalah, dan saya akan mendapatkan peringatan koneksi input.
Awalnya, saya
onTextChanged(CharSequence s, ...)
didefinisikan sebagai berikut:Ketika
onTextChanged(...)
dipanggil, EditText dalam mode hanya baca. Saya tidak yakin apakah ini berarti kami tidak dapat melakukan lebih dari memanggilnyagetText.clear()
(setText(...)
panggilan juga menghasilkan peringatan inputConnection).Namun, panggilan balik
afterTextChanged(Editable s)
adalah tempat yang tepat untuk mengatur teks.Sejauh ini, ini bekerja tanpa peringatan.
sumber
afterTextChanged
metode ini diaktifkanhiddenKeyboardText.getText().clear();
dan diaktifkanhiddenKeyboardText.append("some string");
, dan fakta ini juga harus diperhitungkan. +1 dari saya!if (isResettingKeyboard) return;
ada di atas ...Dari dokumen bantuan
http://developer.android.com/reference/android/view/inputmethod/InputConnection.html
Selain itu, bacaan lebih lanjut menunjukkan
Tampaknya juga memonitor perubahan pada teks tersebut, dan mengingatkan perubahan.
Untuk mengatasi masalah ini, Anda harus menjelajahi kueri basis data yang Anda buat, mungkin di sekitar listViews atau daftar dalam tata letak.
Jika Anda tidak memiliki pandangan, misalnya itu terjadi secara acak di latar belakang, maka saya akan menyarankan bahwa itu bukan masalah elemen UI, jadi abaikan bidang teks dan semacamnya. Ini bisa berupa layanan latar belakang yang menyimpan informasi dalam kursor atau meminta kursor.
Juga, apakah masalah muncul dari aplikasi Anda? atau mungkin milik orang lain yang baru saja Anda instal. Daftar jejak logCat lengkap. Seseorang mungkin mengenali masalah ini.
Saya akan menebak bahwa jika Anda belum menulis sesuatu yang spesifik tentang hal ini maka orang lain akan menerima pesan log, atau mungkin perpustakaan yang Anda gunakan?
sumber
Saya mengalami masalah yang sama. Peringatan itu muncul ketika keyboard lunak diaktifkan di salah satu saya
EditTexts
dan aktivitas kehilangan fokus.Apa yang saya lakukan adalah menyembunyikan keyboard di onPause ();
sumber
Memecahkan masalah ini untuk saya sendiri, mungkin Anda memiliki masalah yang sama.
Hal ini disebabkan oleh Object di HeaderView dari Daftar Adapter .
Saya menggembungkan Tampilan dan mendeklarasikan Objek dan meletakkan TextWatcher di atasnya.
Menambahkannya ke Daftar Adaptor dan membangun adaptor.
Semuanya baik-baik saja Watcher Teks berfungsi.
TETAPI jika saya pernah membangun kembali adaptor setelah pembangunan awal.
itu HeaderView tersebut dibangun juga.
Peringatan itu akan muncul karena Objek dihapus dan Text Watcher masih diatur untuk melihatnya.
The Daftar Adapter dan Object digantikan, dan aku menebak Teks Watcher sedang mencari cara lain ketika itu terjadi.
Jadi peringatan berbunyi dan secara ajaib Pengamat Teks menemukan HeaderView dan Objek . Tapi itu kehilangan fokus dan mencatat peringatan itu.
Menggunakan
memperbaiki masalah ini.
TETAPI jika Anda memiliki Obyek di dalam Adaptor , dan Text Watcher terpasang ke Obyek di dalam Adaptor . Maka Anda mungkin perlu melakukan lebih banyak pekerjaan.
Coba hapus Pendengar dan pasang kembali setelah melakukan pekerjaan apa pun yang mungkin Anda lakukan.
atau
sumber
Selain jawaban antoniom, pastikan bahwa tindakan lebih lanjut yang perlu dilakukan, benar-benar dilakukan setelah menyembunyikan keyboard, jadi jika Anda telah menyembunyikan keyboard seperti di bawah ini:
, Anda harus melakukan tindakan yang berhasil dilakukan setelah menyembunyikan keyboard, seperti:
sumber
Saya mengalami masalah ini ketika saya harus memodifikasi atau mendapatkan teks dari EditText dan itu difokuskan.
Jadi sebelum memodifikasi atau mendapatkannya, saya menutup keyboard dan memperbaikinya.
Mungkin, masalah Anda berbeda.
sumber
Saya telah memecahkan masalah saya dengan memasukkan tipe input pada xml seperti ini: android: inputType = "none | text | textCapWords | textUri"
sebelum itu android: inputType = "text" Ini menyelesaikan masalah saya.
sumber
Kesalahan dalam Logcat: getTextBeforeCursor pada InputConnection tidak aktif
Solusi: Sembunyikan Keyboard Input Anda dan jalankan aplikasi.
sumber
Sembunyikan keyboard perangkat lunak sebelum menghapus EditText - peringatan tidak akan ditampilkan.
Selain itu, tampaknya spesifik perangkat . Saya baru melihatnya di Nexus 4 (Android 7.1). Tidak ada peringatan pada emulator (8.0, 7.1) atau Nexus 5.
sumber
Masalah saya disebabkan oleh pengaturan visibilitas
EditText
keGONE
dan kemudian segera diatur keVISIBLE
setiap kali pengguna mengetik karakter, karena saya menjalankan validasi pada input setiap kali teks berubah dan dalam beberapa kasus tampilan perlu disembunyikan.Solusinya adalah untuk menghindari pengaturan visibilitas Tampilan atau Tata Letak ke PERGI antara UI atau pembaruan negara, karena
EditText
dapat kehilangan fokussumber
Jika ada masalah yang sama dan memperbaikinya dengan mengonversi widget stateless saya menjadi widget statefull Anda dapat mencobanya
sumber