Android: KeyListener de EditText no funciona

Estoy intentando filtrar el char de entrada de un EditText para permitir solamente el valor flotante válido. (por ejemplo: "12,45", sólo una coma, …).

Para esto, utilizo el KeyListener (no confundir con onKeyListener o textChangeListener. Quiero evitar que el usuario introduzca datos no válidos).

En Android 2.3.6 y 3.2 no se llaman keyListener.filter () y keyListener.getAcceptedChars () y puedo introducir cualquier char (no limitado a .getAcceptedChars ())

Encontré pequeñas documentaciones sobre keyListener. Si tienes un buen ejemplo o un documento, estoy muy interesado.

¿Alguna pista de por qué esto no está funcionando?

Qué hice mal ?

Actividad Muestra de código:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(...); setContentView(R.layout.editTextTest_lyt); ... mEditTextTest = (EditText) findViewById(R.id.editTextTest); mEditTextTest.setKeyListener(new NumberCommaDecimalKeyListenerTest()); ...} 

Ejemplo de código de diseño:

 editTextTest_lyt.xml: <EditText android:id="@+id/editTextTest" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1" android:inputType="numberSigned|numberDecimal" android:ems="5" android:maxLength="9" android:maxLines="1" android:gravity="right|center_vertical" android:imeOptions="actionNext"/> 

KeyListener Ejemplo de código:

 public class NumberCommaDecimalKeyListenerTest extends NumberKeyListener { private static final char[] mAccepted = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', ',' }; private static final boolean mSign = true; private static final boolean mDecimal = true; @Override protected char[] getAcceptedChars() { Log.e("LODA", "KeylistenerTest.getAcceptedChars()"); // DONT show up in logs return mAccepted; } public NumberCommaDecimalKeyListenerTest() { super(); Log.e("LODA", "CREATE KeylistenerTest"); // show up in logs } @Override public int getInputType() { Log.e("LODA", "KeylistenerTest.getInputType()"); // show up in logs int contentType = InputType.TYPE_CLASS_NUMBER; if (mSign) { contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED; } if (mDecimal) { contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL; } return contentType; } @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Log.e("LODA", "enter KeylistenerTest.filter"); // DONT show up in logs // My logic will go here... // if user pressed '.', is changed for ',' source = source.toString().replace(".", ","); source = source.toString().replace("6", "9"); CharSequence out = super.filter(source, start, end, dest, dstart, dend); return out; } } 

Mirando los documentos de Android que ellos indican en relación con KeyListener que:

Tenga en cuenta que en la mayoría de los casos esta interfaz ha sido reemplazada por métodos de entrada suave general definidos por InputMethod; sólo debe utilizarse para los casos en que una aplicación tiene su propio teclado en pantalla y también desea procesar los eventos del teclado duro para que coincidan

Y para el método getInputType() :

Si devuelve TYPE_NULL, no se proporcionará ningún teclado virtual. En otras palabras, debe estar proporcionando su propio teclado para la entrada en pantalla y el oyente clave se utilizará para manejar la entrada desde un teclado duro.

Si devuelve cualquier otro valor, se creará un método de entrada suave cuando el usuario ponga el foco en el editor, lo que proporcionará un teclado y también consumirá eventos de teclas duras. Esto significa que el oyente clave generalmente no se utilizará, sino que el método de entrada suave se encargará de administrar la entrada de clave según el tipo de contenido devuelto aquí.

Por tanto, ya que devuelve un tipo de contenido, KeyListener se ignora. ¿Parece que esto no es posible entonces o usted encontró un trabajo alrededor?

Tal vez usted podría crear un TextWatcher personalizado en su lugar y luego establecer esto en el EditText utilizando EditText.addTextChangedListener (TextWatcher textWatcher) .?

  • EditText stucks después de animación y vivo de vuelta en el desplazamiento ...?
  • Android: ¿Cómo cambiar el enfoque en el formulario con la acción del usuario?
  • ScrollView salta a EditText
  • Cómo establecer la posición del cursor en EditText?
  • ¿Cómo puedo agregar OnClickListener a Drawable en EditText?
  • Centrarse en segundo edittext sólo si primero es no-vacío android
  • Mostrar el texto del ayudante debajo de EditText junto con la sugerencia
  • Cómo cambiar el color de texto del mensaje emergente de error para un EditText?
  • ¿Cómo cambiar el color del icono que se coloca dentro de edittext?
  • Cómo desactivar el posicionamiento del cursor y la selección de texto en un EditText? (Androide)
  • Android EditText en ListView - teclado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.