getExtractedText pada peringatan InputConnection tidak aktif di android

128

Saya mendapatkan peringatan berikut di logcat saya.

getExtractedText on inactive InputConnection

Saya tidak dapat menemukan alasan di baliknya. Tolong bantu

pankajagarwal
sumber
4
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): 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());
}
Johnson Wong
sumber
1
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 .

Saya mengatasi masalah ini dengan menelepon:

hiddenKeyboardText.getText().clear();
hiddenKeyboardText.append("some string");

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:

@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.

ahash
sumber
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 ...
ahash
7

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?

Emile
sumber
1
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 ();

@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();
}
antoniom
sumber
2
Ini jawabannya baik-baik saja. Pastikan Anda menyembunyikan keyboard sebelum beralih dari aktivitas yang saat ini ada di layar.
Gábor
1

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);
Xjasz
sumber
1

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
     }
});
Pier Betos
sumber
0

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.

Angelo Moroni
sumber
0

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.

Neemias Fernandes
sumber
3
Tidak melakukan apa pun untuk saya.
DSlomer64
0

Kesalahan dalam Logcat: getTextBeforeCursor pada InputConnection tidak aktif

Solusi: Sembunyikan Keyboard Input Anda dan jalankan aplikasi.

shyam
sumber
0

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.

Inoy
sumber
0

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

ITIT
sumber
0

Jika ada masalah yang sama dan memperbaikinya dengan mengonversi widget stateless saya menjadi widget statefull Anda dapat mencobanya

Mohamed Adly
sumber