Saya mendapatkan peringatan berikut di logcat saya.
getExtractedText on inactive InputConnection
Saya tidak dapat menemukan alasan di baliknya. Tolong bantu
Saya mendapatkan peringatan berikut di logcat saya.
getExtractedText on inactive InputConnection
Saya tidak dapat menemukan alasan di baliknya. Tolong bantu
Jawaban:
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): Skipped 30 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:
if (editText.length() > 0) {
editText.getText().clear();
}
Perhatikan bahwa jika Anda ingin menghapus semua status input dan bukan hanya teks (autotext, autocap, multitap, undo), Anda dapat menggunakan TextKeyListener.clear (Editable e) .
if (editText.length() > 0) {
TextKeyListener.clear(editText.getText());
}
Memperbarui:
Alasan saya mendapatkan peringatan InputConnection bukan karena di mana saya mengatur teks (yaitu, dalam onTextChanged
panggilan balik, atau afterTextChanged
) - itu karena saya menggunakansetText
.
Saya mengatasi masalah ini dengan menelepon:
hiddenKeyboardText.getText().clear();
hiddenKeyboardText.append("some string");
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:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (isResettingKeyboard)
return;
// ... do what needs to be done
resetKeyboardString();
}
public void 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.
@Override
public void afterTextChanged(Editable s) {
if (isResettingKeyboard)
return;
resetKeyboardString();
// ...
}
Sejauh ini, ini bekerja tanpa peringatan.
afterTextChanged
metode ini diaktifkan hiddenKeyboardText.getText().clear();
dan diaktifkan hiddenKeyboardText.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
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?
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 ();
@Override
protected void onPause() {
// hide the keyboard in order to avoid getTextBeforeCursor on inactive InputConnection
InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
super.onPause();
}
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.
View v = LayoutInflater.from(CONTEXT).inflate(R.layout.in_overscrollview, null);
Object= (Object) v.findViewById(R.id.OBJECT_ID);
Object.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after){
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Do my work
//Update my view
}
});
Menambahkannya ke Daftar Adaptor dan membangun adaptor.
JobListView = (ListView) getListView().findViewWithTag("JOBLISTVIEWTAG");
JobListView.addHeaderView(v, null, false);
JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, ITEMS_FOR_ADATER);
ListView.setAdapter(JOBSadapter);
Semuanya baik-baik saja Watcher Teks berfungsi.
TETAPI jika saya pernah membangun kembali adaptor setelah pembangunan awal.
JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, DIFFERENT_ITEMS_FOR_ADAPTER);
ListView.setAdapter(JOBSadapter);
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
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.
Object.removeTextChangedListener();
atau
Object.addTextChangedListener(null);
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:
public void hideKeyboard() {
InputMethodManager inputMethodManager =(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}
, Anda harus melakukan tindakan yang berhasil dilakukan setelah menyembunyikan keyboard, seperti:
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
finish(); //Sample succeeding code
}
});
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.
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Mungkin, masalah Anda berbeda.
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.
Masalah saya disebabkan oleh pengaturan visibilitas EditText
ke GONE
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 fokus
Jika ada masalah yang sama dan memperbaikinya dengan mengonversi widget stateless saya menjadi widget statefull Anda dapat mencobanya