Los dispositivos móviles tienen dos tipos de teclas: las físicas, como el botón de encendido y las de volumen, y las del teclado virtual que vemos cuando nos colocamos sobre un campo de texto, por ejemplo.
Según la finalidad, podemos interceptar las pulsaciones de unos u otros mediante diferentes métodos. Por ejemplo, tanto la clase Activity como View implementan la interfaz KeyEvent.Callback. Podemos sobrescribir los métodos de la interfaz y de ese modo interceptar los eventos de teclado. Veamos un ejemplo:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
Log.e("Activity", "onKeyDown: keyCode=$keyCode, $event")
return super.onKeyDown(keyCode, event)
}
override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
Log.e("Activity", "onKeyDown: keyCode=$keyCode, $event")
return super.onKeyUp(keyCode, event)
}
override fun onKeyLongPress(keyCode: Int, event: KeyEvent?): Boolean {
Log.e("Activity", "onKeyDown: keyCode=$keyCode, $event")
return super.onKeyLongPress(keyCode, event)
}
...
Si ejecutamos la app y presionamos el botón de volumen, en el Logcat veremos:
Activity: onKeyDown: keyCode=25, KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_VOLUME_DOWN, scanCode=114, repeatCount=0, eventTime=79300600, downTime=79300600 }
Activity: onKeyDown: keyCode=25, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_VOLUME_DOWN, scanCode=114, repeatCount=0, eventTime=79300800, downTime=79300600 }
Estas funciones onKeyXXX nos informan del evento mediante dos parámetros:
- keyCode: un entero relacionado con una constante que nos indicará la tecla pulsada. Si pulsamos la tecla Ctrl y hacemos clic sobre la clase KeyEvent en el código anterior, Android Studio abrirá el código fuente de la clase. Aquí podremos ver la definición de todas las funciones y constantes, como, por ejemplo, KEYCODE_CAMERA, KEYCODE_A, KEYCODE_Z, etcétera.
- event: es una instancia de la clase KeyEvent. Esta clase amplía la información sobre el evento. No solo guarda el keyCode, sino otros parámetros como: action (ACTION_DOWN, ACTION_UP o ACTION_MULTIPLE), repeatCount (número de veces que se presionó la tecla), isAltPressed si la tecla Alt estaba presionada mientras se pulsó y muchos otros parámetros relativos al evento.
El valor devuelto por las funciones es booleano. Si ya hemos procesado el evento y no deseamos que siga propagándose por las demás vistas, retornaremos true. Si, por el contrario, solo queríamos escuchar pero queremos que el evento siga hasta el siguiente listener, retornaremos false.
También podríamos necesitar manejar los botones de medios. Estos botones son botones físicos que tienen algunos dispositivos periféricos, como los auriculares o joysticks, que se conectan al móvil. Al presionar estos botones, la aplicación recibirá un KeyEvent, como hemos visto anteriormente. El código de estos botones, sin embargo, comienza con KEYCODE_MEDIA en lugar de con KEYCODE.