Respuestas:
Para hacerlo, establezca un OnKeyListener
en su EditText
.
Aquí hay una muestra de mi propio código. Tengo un EditText
nombre addCourseText
, que llamará a la función addCourseFromTextBox
cuando se haga clic en la tecla Intro o en el D-pad.
addCourseText = (EditText) findViewById(R.id.clEtAddCourse);
addCourseText.setOnKeyListener(new OnKeyListener()
{
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_DOWN)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
addCourseFromTextBox();
return true;
default:
break;
}
}
return false;
}
});
android:inputType="text"
xml para que el texto de edición muestre la tecla Intro frente al teclado predeterminado que tiene un retorno de carro.
<EditText
android:id="@+id/search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/search_hint"
android:inputType="text"
android:imeOptions="actionSend" />
A continuación, puede escuchar las pulsaciones en el botón de acción definiendo un TextView.OnEditorActionListener para el elemento EditText. En su oyente, responda al ID de acción de IME apropiado definido en la clase EditorInfo, como IME_ACTION_SEND. Por ejemplo:
EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
boolean handled = false;
if (actionId == EditorInfo.IME_ACTION_SEND) {
sendMessage();
handled = true;
}
return handled;
}
});
Fuente: https://developer.android.com/training/keyboard-input/style.html
puede ser que pueda agregar un atributo a su EditText como este:
android:imeOptions="actionSearch"
android:inputType="text"
así
También podemos utilizar Kotlin lambda
editText.setOnKeyListener { _, keyCode, keyEvent ->
if (keyEvent.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
Log.d("Android view component", "Enter button was pressed")
return@setOnKeyListener true
}
return@setOnKeyListener false
}
Para evitar que el enfoque avance al siguiente campo editable (si tiene uno), es posible que desee ignorar los eventos de tecla hacia abajo, pero maneje los eventos de tecla hacia arriba. También prefiero filtrar primero en el keyCode, asumiendo que sería un poco más eficiente. Por cierto, recuerde que devolver verdadero significa que ha manejado el evento, por lo que ningún otro oyente lo hará. De todos modos, aquí está mi versión.
ETFind.setOnKeyListener(new OnKeyListener()
{
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER
|| keyCode == KeyEvent.KEYCODE_ENTER) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
// do nothing yet
} else if (event.getAction() == KeyEvent.ACTION_UP) {
findForward();
} // is there any other option here?...
// Regardless of what we did above,
// we do not want to propagate the Enter key up
// since it was our task to handle it.
return true;
} else {
// it is not an Enter key - let others handle the event
return false;
}
}
});
esta es una muestra de una de mis aplicaciones cómo manejo
//searching for the Edit Text in the view
final EditText myEditText =(EditText)view.findViewById(R.id.myEditText);
myEditText.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN)
if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) ||
(keyCode == KeyEvent.KEYCODE_ENTER)) {
//do something
//true because you handle the event
return true;
}
return false;
}
});
La forma más actualizada de lograr esto es:
Agregue esto a su EditText en XML:
android:imeOptions="actionSearch"
Luego, en tu Actividad / Fragmento:
EditText.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
// Do what you want here
return@setOnEditorActionListener true
}
return@setOnEditorActionListener false
}