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).
- El enfoque aleatoriamente salta al desplazarse
- Diseña Android EditText para mostrar el mensaje de error descrito por google
- Cómo detectar si los usuarios dejan de escribir en EditText android
- ¿Cómo hace un Android EditText (TextView) dibujar el cursor parpadeante?
- EditText OnKeyListener no funciona
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; } }
- Quitar icono de la contraseña de la muestra en Android N
- EditText cursor y color del puntero para debajo de android 5.0
- Cómo agregar texto con formato en el texto de edición?
- El cursor EditText se vuelve invisible en JellyBean
- EditText cómo activar copia / pegar popup sin barra de acción?
- Cómo hacer que TextInputLayout asigne rojo asterisco para los campos obligatorios
- EditText en GridView: Cómo obtener valor de Multiple EditText
- Android ClickableSpan que no llama onClick
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) .?
- ListView – barra de desplazamiento vertical en el lado izquierdo
- Appcelerator Titanium Android servicio de ubicación de fondo