Recibo la siguiente advertencia en mi logcat.
getExtractedText on inactive InputConnection
No puedo encontrar la razón detrás de esto. Por favor ayuda
Recibo la siguiente advertencia en mi logcat.
getExtractedText on inactive InputConnection
No puedo encontrar la razón detrás de esto. Por favor ayuda
Respuestas:
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 inactivas de InputConnection 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. Efectivamente, InputConnection está abrumado 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 provoca la corriente 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 presionar el botón cuando la aplicación está bajo carga suficiente, etc.
Afortunadamente, encontré otra forma de borrar el texto: Editable.clear () . Con esto no recibo advertencias en absoluto:
if (editText.length() > 0) {
editText.getText().clear();
}
Tenga en cuenta que si desea borrar todo el estado de entrada y no solo el texto (autotext, autocap, multitap, undo), puede usar TextKeyListener.clear (Editable e) .
if (editText.length() > 0) {
TextKeyListener.clear(editText.getText());
}
Actualizar:
La razón por la que recibí advertencias de InputConnection no se debió a dónde estaba configurando el texto (es decir, en la onTextChanged
devolución de llamada o al afterTextChanged
), sino porque estaba usando setText
.
Resolví el problema llamando a:
hiddenKeyboardText.getText().clear();
hiddenKeyboardText.append("some string");
Nota: Todavía hago la llamada en la afterTextChanged
devolución de llamada, aunque también funciona sin advertencias ontextChanged
.
Respuesta anterior:
También recibí mensajes idénticos en logcat, aunque mi escenario era ligeramente diferente. Quería leer cada carácter que entraba en EditText (o caracteres compuestos / texto pegado), y luego restablecer 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 fue problemático, y recibí 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 onTextChanged(...)
se llama, EditText está en modo de solo lectura. No estoy seguro de si esto significa que no podemos hacer más que invocarlo getText.clear()
(las setText(...)
llamadas también producen advertencias de inputConnection).
Sin embargo, la devolución de llamada afterTextChanged(Editable s)
es el lugar correcto para configurar el texto.
@Override
public void afterTextChanged(Editable s) {
if (isResettingKeyboard)
return;
resetKeyboardString();
// ...
}
Hasta el momento, esto funciona sin ninguna advertencia.
afterTextChanged
el método se llama en hiddenKeyboardText.getText().clear();
y sobre hiddenKeyboardText.append("some string");
, y este hecho también deben tenerse en cuenta. +1 de mi parte!
if (isResettingKeyboard) return;
esté en la cima ...
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 utiliza para realizar tareas tales como leer texto alrededor del cursor, confirmar texto en el cuadro de texto y enviar eventos clave sin procesar a la aplicación.
Además, la lectura adicional muestra
getExtractedText (): este método puede fallar si la conexión de entrada se ha vuelto inválida (por ejemplo, si el proceso se bloquea) o si el cliente tarda demasiado en responder con el texto (se le devuelve un par de segundos) . En cualquier caso, se devuelve un valor nulo.
Parece que también supervisa los cambios a dicho texto y alerta los cambios.
Para buscar el problema, tendrá que explorar cualquier consulta de base de datos que esté haciendo, tal vez alrededor de listViews 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, así que ignore los campos de texto y demás. Podría ser un servicio en segundo plano que almacena información en un cursor o solicita un cursor.
Además, ¿surge el problema de su aplicación? o quizás alguien más que hayas instalado recientemente. Listar el seguimiento completo de logCat. Alguien podría reconocer el problema.
Me arriesgaría a adivinar que si no ha escrito algo específico sobre esto, ¿es alguien más el mensaje de registro, o tal vez el de una biblioteca que está usando?
Estaba teniendo el mismo problema. La advertencia apareció cuando el teclado virtual se activó en uno de mis EditTexts
y la actividad perdió 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();
}
Resolví este problema por mí mismo, tal vez tengas el mismo problema.
Esto fue causado por un objeto en el HeaderView del Adaptador de lista .
Inflé una vista y declaró el objeto y le puse un TextWatcher .
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 creó 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 compilación inicial.
JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, DIFFERENT_ITEMS_FOR_ADAPTER);
ListView.setAdapter(JOBSadapter);
Ese encabezado se reconstruye.
Esa advertencia se mostraría porque el Objeto se eliminó y el Observador de texto todavía estaba configurado para vigilarlo.
El Adaptador de lista y el Objeto fueron reemplazados, y supongo que el Observador de texto estaba mirando hacia otro lado cuando sucedió.
Entonces, la advertencia se dispara y milagrosamente el Text Watcher encuentra el HeaderView y el Object . Pero pierde el foco y registra esa advertencia.
Utilizando
JOBSadapter.notifyDataSetChanged();
solucionó el problema.
PERO si tiene un Objeto dentro del Adaptador , y el Observador de Texto está conectado al Objeto dentro del Adaptador . Entonces es posible que deba hacer un poco más de trabajo.
Intente eliminar el oyente y vuelva a conectarlo después de hacer cualquier trabajo que esté haciendo.
Object.removeTextChangedListener();
o
Object.addTextChangedListener(null);
Además de la respuesta de antoniom, asegúrese de que cualquier otra acción que se necesite hacer, realmente se realice después de ocultar el teclado, así 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);
}
, debe realizar acciones subsiguientes 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 estaba enfocado.
Entonces, antes de modificarlo o obtenerlo, cerré el teclado y lo reparé.
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.
Mi problema fue causado por ajuste de la visibilidad de la EditText
que GONE
e inmediatamente después ajustarlo a VISIBLE
cada vez que el usuario ha escrito un personaje, como yo estaba corriendo la validación de la entrada cada vez que el texto ha cambiado y en algunos casos la visión necesario que se oculta.
Por lo tanto, la solución es evitar establecer la visibilidad de Vista o Diseño en GONE entre UI o actualizaciones de estado, ya que EditText
pueden perder el foco
Si tiene el mismo problema y lo soluciona convirtiendo mi widget sin estado en widget con estado, puede probarlo