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 que el usuario escribe. El EditText se borra cuando el usuario presiona un botón. Muchas entradas de InputConnection inactivas salen 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. Por supuesto, el InputConnection está abrumado por las solicitudes para borrar el texto. Intenté modificar el código para comprobar la longitud del texto antes de intentar borrarlo:

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

Esto ayuda a mitigar el problema en que al presionar el botón rápidamente ya no provoca el flujo de advertencias IInputConnectionWrapper. Sin embargo, esto sigue siendo propenso a problemas cuando el usuario alterna rápidamente entre escribir algo y presionar el botón o presiona el botón cuando la aplicación está bajo carga suficiente, 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 sólo el texto (autotexto, autocap, multitap, deshacer), puede utilizar 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 era debido a dónde estaba configurando el texto (es decir, en la onTextChanged llamada onTextChanged o afterTextChanged ) – era porque estaba usando setText .

Conseguí alrededor de la edición llamando:

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

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

Respuesta anterior:

Yo estaba recibiendo mensajes idénticos en logcat, así, aunque mi escenario era un poco diferente. Quería leer todos los caracteres que entraron en EditText (o caracteres compuestos / texto pegado), y luego restablecer el EditText en cuestión a una cadena de inicialización por defecto.

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

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 onTextChanged(...) se llama, el EditText está en modo readonly. No estoy seguro de si esto significa que no podemos hacer más que llamar a getText.clear() en él ( setText(...) llamadas producen advertencias inputConnection también).

Sin embargo, la devolución de llamada afterTextChanged(Editable s) es el lugar correcto para establecer el texto.

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

Hasta ahora, esto está funcionando 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 de un InputMethod de nuevo a la aplicación que está recibiendo su entrada. Se utiliza para realizar cosas 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, una lectura adicional muestra

GetExtractedText (): Este método puede fallar si la conexión de entrada se ha convertido en no válida (como su proceso se bloquea) o el cliente tarda demasiado tiempo para responder con el texto (se le da un par de segundos para volver) . En cualquier caso, se devuelve un valor nulo.

Parece también supervisar los cambios a dicho texto y alertar los cambios.

Para buscar el problema hacia abajo tendrás que explorar cualquier consulta de base de datos que estás haciendo, tal vez alrededor de listViews o listas en un diseño.

Si usted no tiene ninguna opinión, por ejemplo está sucediendo al azar en el fondo, entonces sugeriría que su no un problema del elemento de la interfaz de usuario, así que ignore textfields y tal. Podría ser un servicio de fondo que está almacenando información en un cursor o solicitando un cursor.

Además, ¿surge el problema de su aplicación? O quizás alguien más que has instalado recientemente. Enumere el rastreo completo de logCat. Alguien podría reconocer el problema.

Me arriesgaría a suponer que si usted no ha escrito algo específico en torno a esto que su alguien elses mensaje de registro, o tal vez la de una biblioteca de su uso?

Estaba teniendo el mismo problema. La advertencia apareció cuando el teclado suave se activó en uno de mis EditTexts y la actividad pierde el 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í tal vez usted tiene el mismo problema.

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

Inflé una vista y declaré el objeto y poner un TextWatcher en é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 } }); 

Lo agregó al adaptador de lista y 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 Text Watcher funciona.

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

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

Que HeaderView también se reconstruye.

Esa advertencia se mostraría porque el objeto se eliminó y el observador de texto todavía estaba fijado viendo para ello.

El Adaptador de lista y el Objeto fueron reemplazados, y supongo que el Text Watcher estaba buscando el otro camino cuando sucedió.

Así que la advertencia se apaga y milagrosamente el observador de texto encuentra el HeaderView y el objeto . Pero pierde el foco y registra esa advertencia.

Utilizando

 JOBSadapter.notifyDataSetChanged(); 

Resolvió el problema.

PERO si usted tiene un objeto dentro del adaptador , y el observador del texto se ata al objeto dentro del adaptador . Entonces puede que necesite hacer un poco más de trabajo.

Trate de quitar el oyente y adjúntelo de nuevo después de hacer cualquier trabajo que esté haciendo.

 Object.removeTextChangedListener(); 

o

 Object.addTextChangedListener(null); 

Aparte de la respuesta de antoniom, asegúrese de que cualquier acción adicional que se necesita hacer, 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); } 

, Es necesario tener acciones posteriores ejecutadas 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 o obtener texto de EditText y se centró.

Así que antes de modificar o obtener de ella, he cerrado el teclado y lo arreglo.

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

Tal vez, su 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 que era android: inputType = "text" Esto resolvió mi problema.

  • "AndroidRuntime: Apagar VM" con nada más
  • La aplicación se ha detenido de forma inesperada: ¿Cómo depurar?
  • ¿Cómo habilitar LogCat / Console en Eclipse para Android?
  • ¿Cómo puedo obtener Logcat para varios dispositivos que se ejecutan al mismo tiempo en Eclipse?
  • La aplicación Android falla sin ningún logcat ni ninguna excepción
  • Imprimir una lista <String> a logcat
  • Cómo ver una matriz en logcat para android
  • Android studio logcat no funciona
  • Mostrar Logcat en Terminal?
  • Logcat in eclipse mantiene el borrado automático
  • Cómo interpretar Logcat
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.