solo - validar edittext en android studio
Tecla Intro en EditText pulsando onKey dos veces (7)
Ahhhh
Creo que esto está sucediendo para arriba y abajo?
He adjuntado un OnKeyListener a un EditText. He anulado el controlador onKey para capturar un KeyEvent.
Cuando un usuario pulsa la tecla enter (ya sea la tecla enter de su computadora mientras usa el emulador o la tecla enter del hardware en su teléfono con un teclado de hardware), el controlador onKey se ejecuta dos veces. Ambas ejecuciones tienen el código clave 66.
¿Por qué está pasando esto?
Quiero mi pantalla para que cuando el usuario presione la tecla enter, se realice una búsqueda. Debido a lo que está sucediendo, la búsqueda se realiza innecesariamente dos veces.
Mi método se ve así:
mFilter.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
// perform search
return true;
}
return false;
}
});
Depuré y lo que funcionó para mí fue eso,
editText.setOnKeyListener(View.OnKeyListener { view, i, keyEvent ->
if (i == KeyEvent.KEYCODE_ENTER && enterAsSend && (keyEvent.action == KeyEvent.ACTION_UP || keyEvent.action == KeyEvent.ACTION_DOWN)) {
//Do stuff
}
return@OnKeyListener true
}
false
})
y verifique su Editext ese android:inputType="textNoSuggestions"
porque el primer clic en la tecla enter nos da la sugerencia del diccionario.
Este evento es KeyEvent.ACTION_DOWN
por KeyEvent.ACTION_DOWN
y KeyEvent.ACTION_UP
. He hecho la depuración y finalmente me doy cuenta de que hay un KeyEvent event
llamado KeyEvent event
que nunca uso, luego verifiqué y encontré el problema.
Prueba esto:
mFilter.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
// perform search
return true;
}
}
return false;
}
});
Puedes filtrar así:
object.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
// do stuff
return true;
}
return false;
}
});
Idem cuando presionas la tecla con KeyEvent.ACTION_DOWN
Tuve el mismo problema y las respuestas anteriores me ayudaron, pero estoy usando Xamarin.Android (c #) por lo que es una sintaxis ligeramente diferente ... Esto es lo que funcionó para mí:
MyStringTextBox.KeyPressed += OnEnterKeyPressed;
protected void OnEnterKeyPressed(object sender, View.KeyEventArgs e)
{
if (e.KeyCode == Keycode.Enter && e.Event.Action == KeyEventActions.Up)
{
DoSomething(this, EventArgs.Empty);
}
else
{
e.Handled = false;
}
}
De esta manera, solo se llamará DoSomething () al presionar la tecla Enter (arriba) y, por lo tanto, se disparará una vez. Funciona y se prueba en Xamarin.Android
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==0) {