EditText OnKeyListener no funciona

Sé que esta / pregunta similar se ha hecho antes pero la solución dada no está trabajando para mí así que estoy preguntando otra vez. Intenté la solución dada en esa respuesta pero todavía mi OnKeyListener nunca se invoca en algunos dispositivos, especialmente ésos con OS común. Necesito detectar el presionar de la llave de del teclado suave cuando cuando no hay carácter en editText. Aquí está mi código;

EditText et = (EditText) findViewById(R.id.et); et.setOnKeyListener(new EditText.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { Log.d("OnKeyListener", keyCode + " character(code) to send"); return false; } }); 

Finalmente me resolví implementando esta característica a través de TextWatcher . El obstáculo principal era que, yo necesitaba detectar la prensa de retroceso incluso cuando no hay carácter en EditText o por lo menos el usuario final percibe que allí no es ningún carácter allí. La cosa del puño no podría ser alcanzada sin embargo hice el más adelante uno. La siguiente es la solución detallada.

En primer lugar, siempre he conservado un espacio '' carácter en mi editText .

 editText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { if(cs.toString().length() == 0) editText.setText(" "); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void afterTextChanged(Editable arg0) { } }); 

A continuación, personalizé EditText para notificarme para cada cambio de posición del cursor. Este propósito se logra mediante la onSelectionChanged método EditText de EditText . Mi EditText personalizado se ve así.

 public class SelectionEnabledEditText extends EditText { public SelectionEnabledEditText(Context context) { super(context); } public SelectionEnabledEditText(Context context, AttributeSet attrs) { super(context, attrs); } public SelectionEnabledEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onSelectionChanged(int selStart, int selEnd) { super.onSelectionChanged(selStart, selEnd); if(onSelectionChangeListener != null) onSelectionChangeListener.onSelectionChanged(selStart, selEnd); } public static interface OnSelectionChangeListener{ public void onSelectionChanged(int selStart, int selEnd); } private OnSelectionChangeListener onSelectionChangeListener; public void setOnSelectionChangeListener(OnSelectionChangeListener onSelectionChangeListener) { this.onSelectionChangeListener = onSelectionChangeListener; } } 

Por último, en mi actividad, estoy escuchando la posición del cursor cambio de evento y restablecer mi posición del cursor en editText si está allí en el espacio necesario charatcer iniciar es decir en 0 º índice, como este;

 editText.setOnSelectionChangeListener(new SelectionEnabledEditText.OnSelectionChangeListener() { @Override public void onSelectionChanged(int selStart, int selEnd) { if (selEnd == 0) { if (editText.getText().toString().length() == 0) editText.setText(" "); editText.setSelection(1); } } }); 

Espero que esto sea útil en situaciones similares. Sugerencias son bienvenidas para mejoras / optimizaciones.

La documentación indica que los eventos clave sólo se propagarán para los trazos de clave de hardware, no software.

http://developer.android.com/reference/android/view/View.OnKeyListener.html

Los fabricantes de dispositivos están siendo desalentados para propagar eventos de teclado suave a través de los oyentes clave, aunque es completamente hasta el fabricante para honrar o tratar realmente los teclados blandos y duros con iguales términos.

A partir de Android 4.2.2, el sistema Android en sí no soportará eventos clave para los teclados blandos, por lo que incluso los fabricantes no podrán elegir su camino.

Así que la única opción a prueba de errores aquí es implementar su propio IME (teclado suave), y manejar las pulsaciones de teclado usted mismo.

TextWatcher se puede utilizar principalmente para reemplazar a los oyentes clave, sin embargo editText.setText (…); También activará los eventos de TextWatcher, así que si uno está interesado en teclear sólo entonces TextWatcher probablemente no es una solución tampoco.

Tenga cuidado cuando utilice TextWatcher con AutocomleteTextView o EditText. No modifique texto en el contenido de AutocompleteTextView / EditText desde dentro de eventos de TextWatcher, porque de lo contrario probablemente terminará en un bucle infinito de eventos / escuchas.

Basándose en la documentación de OnKeyListener , parece que la devolución de llamada se invoca sólo para teclados de hardware.

Definición de interfaz para una llamada a invocarse cuando se envía un evento de clave de hardware a esta vista. La devolución de llamada se invocará antes de que se dé el evento clave a la vista. Esto sólo es útil para teclados de hardware; Un método de entrada de software no tiene ninguna obligación de activar este oyente.

Intente algo como esto:

 public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL) { //Log key Log.d("OnKeyListener", keyCode + " character(code) to send"); } return false; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.