getExtractedText en la advertencia de InputConnection inactiva en android

Recibo la siguiente advertencia en mi logcat.

getExtractedText on inactive InputConnection 

No puedo encontrar la razón detrás de esto. Por favor ayuda

Me encontré con un problema similar. Mi logcat:

 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. 

Mi situación: tengo una vista EditText en la que el usuario escribe. EditText se borra cuando el usuario presiona un botón. Muchas entradas de InputConnection inactivas se emiten cuando presiono rápidamente el botón.

Ex:

 editText.setText(null); 

La última línea en mi logcat anterior proporciona una gran indicación de lo que está sucediendo. Efectivamente, la InputConnection se ve abrumada por las solicitudes para borrar el texto. Intenté modificar el código para verificar la longitud del texto antes de intentar borrarlo:

 if (editText.length() > 0) { editText.setText(null); } 

Esto ayuda a mitigar el problema, ya que presionar el botón rápidamente ya no causa la transmisión de las advertencias de IInputConnectionWrapper. Sin embargo, esto todavía es propenso a problemas cuando el usuario alterna rápidamente entre escribir algo y presionar el botón o presionar el botón cuando la aplicación tiene suficiente carga, etc.

Afortunadamente, encontré otra forma de borrar texto: Editable.clear () . Con esto no recibo ninguna advertencia:

 if (editText.length() > 0) { editText.getText().clear(); } 

Tenga en cuenta que si desea borrar todo el estado de entrada y no solo el texto (autotexto, autocap, multitap, deshacer), puede usar TextKeyListener.clear (Editable e) .

 if (editText.length() > 0) { TextKeyListener.clear(editText.getText()); } 

Actualizar:

La razón por la que estaba recibiendo advertencias de InputConnection no fue por dónde estaba configurando el texto (es decir, en la onTextChanged llamada onTextChanged , o afterTextChanged ), sino porque estaba usando setText .

Entendí el problema llamando:

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

Nota: Todavía realizo la llamada en la afterTextChanged llamada afterTextChanged , aunque funciona sin advertencias de ontextChanged también.

Respuesta anterior:

También recibía mensajes idénticos en Logcat, aunque mi situación era ligeramente diferente. Quería leer todos los caracteres que entraron en EditText (o los caracteres compuestos / texto pegado), y luego reiniciar el EditText en cuestión a una cadena de inicialización predeterminada.

La parte de texto claro funciona según la solución de Johnson anterior. Sin embargo, restablecer el texto era problemático y recibiría advertencias de conexión de entrada.

Inicialmente, mi onTextChanged(CharSequence s, ...) se definió de la siguiente manera:

 @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; } 

Cuando se onTextChanged(...) , EditText está en modo de solo lectura. No estoy seguro si esto significa que no podemos hacer más que llamar a getText.clear() en él ( setText(...) llamadas también producen advertencias de entrada de conexión).

Sin embargo, la callback afterTextChanged(Editable s) es el lugar correcto para establecer el texto.

 @Override public void afterTextChanged(Editable s) { if (isResettingKeyboard) return; resetKeyboardString(); // ... } 

Esto es, hasta ahora, trabajando sin ninguna advertencia.

De los documentos de ayuda

http://developer.android.com/reference/android/view/inputmethod/InputConnection.html

La interfaz InputConnection es el canal de comunicación desde un InputMethod a la aplicación que está recibiendo su entrada. Se usa para realizar cosas tales como leer texto alrededor del cursor, enviar texto al cuadro de texto y enviar eventos de clave sin procesar a la aplicación.

Además, lecturas adicionales muestran

getExtractedText (): este método puede fallar si la conexión de entrada se ha vuelto inválida (como su locking de proceso) o si el cliente tarda demasiado en responder con el texto (se le da un par de segundos para regresar) . En cualquier caso, se devuelve un nulo.

Parece que también monitorea los cambios a dicho texto y alerta los cambios.

Para cazar el problema, tendrá que explorar cualquier consulta de base de datos que esté realizando, tal vez en listas o listas en un diseño.

Si no tiene ninguna vista, por ejemplo, está sucediendo aleatoriamente en segundo plano, entonces sugeriría que no es un problema de elemento de la interfaz de usuario, por lo tanto, ignore los campos de texto y tal. Podría ser un servicio en segundo plano que almacena información en un cursor o solicita un cursor.

Además, ¿el problema surge de tu aplicación? o tal vez alguien más que hayas instalado recientemente. Enumere la traza completa de logCat. Alguien podría reconocer el problema.

Me arriesgaría a adivinar que si no has escrito algo específico al respecto, ¿alguien puede usar el mensaje de registro o quizás el de una biblioteca?

Estaba teniendo el mismo problema. La advertencia apareció cuando el teclado EditTexts se activó en uno de mis EditTexts y la actividad perdió foco.

Lo que hice fue ocultar el teclado en 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(); } 

Resuelto este problema para mí, quizás tengas el mismo problema.

Esto fue causado por un objeto en el HeaderView del adaptador de lista .

Inflé una Vista y declare el Objeto y coloqué un TextWatcher sobre él.

 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 } }); 

Se lo agregó al adaptador de lista y se construyó el adaptador.

 JobListView = (ListView) getListView().findViewWithTag("JOBLISTVIEWTAG"); JobListView.addHeaderView(v, null, false); JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, ITEMS_FOR_ADATER); ListView.setAdapter(JOBSadapter); 

Todo está bien, el Vigilante de texto funciona.

PERO si alguna vez reconstruí el adaptador después de la comstackción inicial.

 JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, DIFFERENT_ITEMS_FOR_ADAPTER); ListView.setAdapter(JOBSadapter); 

Ese HeaderView también se reconstruye.

Esa advertencia se mostraría porque el Objeto se eliminó y el Observador de texto todavía estaba configurado para verlo.

El List Adaptor y Object fueron reemplazados, y supongo que el Text Watcher estaba mirando para otro lado cuando sucedió.

Entonces la advertencia se apaga y milagrosamente el Vigilante de Texto encuentra HeaderView y el Objeto . Pero pierde el foco y registra esa advertencia.

Utilizando

 JOBSadapter.notifyDataSetChanged(); 

arregló el problema

PERO si tiene un Objeto dentro del Adaptador , y el Observador de Texto está unido al Objeto dentro del Adaptador . Entonces es posible que necesite hacer un poco más de trabajo.

Intente quitar el Oyente y vuelva a colocarlo después de hacer cualquier trabajo que pueda estar haciendo.

 Object.removeTextChangedListener(); 

o

 Object.addTextChangedListener(null); 

Aparte de la respuesta de Antoniom, asegúrese de que haya que hacer más acciones, realmente se hace después de ocultar el teclado, por lo que si ha ocultado el teclado como el siguiente:

 public void hideKeyboard() { InputMethodManager inputMethodManager =(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); } 

, necesitas tener acciones exitosas realizadas después de ocultar el teclado, así:

 getWindow().getDecorView().post(new Runnable() { @Override public void run() { finish(); //Sample succeeding code } }); 

Tuve este problema cuando tuve que modificar u obtener texto de EditText y se centró.

Entonces, antes de modificar o salir de él, cerré el teclado y lo solucioné.

 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); 

Tal vez, tu problema es diferente.

Había resuelto mi problema al insertar un tipo de entrada en xml como este: android: inputType = “none | text | textCapWords | textUri”

antes de eso era android: inputType = “text” Esto resolvió mi problema.

Error en Logcat: getTextBeforeCursor en InputConnection inactivo

Solución: Oculte su teclado de entrada y ejecute la aplicación.