Ejecutar código en Android (2/2)

Para que nuestro juego conozca lo que ha ocurrido en el Dialog será necesario crear un listener que escuche a los eventos del diálogo. Además, otro ejemplo creando un Toast.

En el desarrollo con LiveGDX, ejecutar código específico de Android y de escritorio puede presentar ciertos retos, especialmente cuando trabajamos con eventos asíncronos. Al crear interfaces que interactúan con el usuario, como diálogos con botones de confirmación, necesitamos una forma eficiente de manejar las respuestas sin bloquear el hilo principal de la aplicación.

Para abordar esta situación, podemos implementar un sistema de listeners personalizados que nos permita recibir y reaccionar a las acciones del usuario. Por ejemplo, creamos una clase llamada DialogListener que define dos métodos: onPressYes y onPressNo. Estos métodos representan las acciones que queremos ejecutar cuando el usuario pulse Sí o No en un diálogo.

En la práctica, instanciamos un objeto de DialogListener donde definimos qué debe ocurrir en cada uno de estos métodos. Por ejemplo, podemos cambiar el texto de un botón en la interfaz para reflejar la elección del usuario. Luego, pasamos esta instancia a nuestro diálogo personalizado, de modo que cuando el usuario pulse un botón, el diálogo invoque el método correspondiente del listener.

Para que esto funcione, es necesario modificar la estructura de nuestro código para que el diálogo reciba el listener y lo utilice en los eventos de los botones. En el caso de LiveGDX, esto implica pasar el listener a través de las distintas clases que componen la interfaz, desde el Main hasta el diálogo, asegurándonos de que cada componente tenga acceso al listener para poder llamar a sus métodos cuando corresponda.

Un ejemplo simplificado de la clase DialogListener podría ser:

public interface DialogListener {
    void onPressYes();
    void onPressNo();
}

Y en el diálogo, al detectar el clic en el botón Sí, llamaríamos:

listener.onPressYes();

y de forma similar para el botón No:

listener.onPressNo();

En la implementación para escritorio, la gestión es más sencilla porque podemos utilizar JOptionPane de Swing, que bloquea el hilo y devuelve directamente la opción seleccionada. Así, podemos llamar a JOptionPane.showConfirmDialog y, según el resultado, invocar el método adecuado del listener. Por ejemplo:

int resultado = JOptionPane.showConfirmDialog(null, "¿Qué quieres hacer?", "Pregunta", JOptionPane.YES_NO_OPTION);
if (resultado == JOptionPane.YES_OPTION) {
    listener.onPressYes();
} else if (resultado == JOptionPane.NO_OPTION) {
    listener.onPressNo();
}

Esto permite mantener una lógica común para la respuesta del usuario, adaptando la implementación según la plataforma.

Además de los diálogos, es común querer mostrar notificaciones breves al usuario, como los mensajes tipo Toast en Android. Para integrarlos en LiveGDX, podemos definir un método en la interfaz de plataforma que reciba un mensaje y se encargue de mostrarlo. En Android, esto se hace llamando a Toast.makeText y luego a show, asegurándonos de ejecutar este código en el hilo de la interfaz de usuario mediante runOnUiThread para evitar errores.

Un ejemplo de implementación en Android sería:

public void mostrarMensaje(final CharSequence mensaje) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_SHORT).show();
        }
    });
}

En la plataforma de escritorio, dado que no existe un equivalente sencillo a Toast, podemos dejar este método vacío o incluso ocultar el botón que dispara la notificación para evitar confusión.

Con estas técnicas, podemos manejar eventos asíncronos y mostrar notificaciones de forma efectiva en LiveGDX, adaptando el comportamiento según la plataforma y manteniendo una arquitectura limpia y orientada a objetos. Esto nos permite crear aplicaciones más interactivas y con una mejor experiencia de usuario, aprovechando las capacidades nativas de cada entorno.

Lista de reproducción
  1. 1
    Instalación y creación de proyectos
    20 minutos
  2. 2
    Festival de la compilación
    21 minutos
  3. 3
    Dibujar por pantalla
    30 minutos
  4. 4
    Procesando entrada
    26 minutos
  5. 5
    Más tipos de imagen
    28 minutos
  6. 6
    Más tipos de entrada
    33 minutos
  7. 7
    Control de resolución
    26 minutos
  8. 8
    Scene2D
    alrededor de 1 hora
  9. 9
    Scene2D UI (parte 1)
    44 minutos
  10. 10
    Scene2D UI (parte 2)
    32 minutos
  11. 11
    Código dependiente de la plataforma
    8 minutos
  12. 12
    Ejecutar código de Android (1/2)
    11 minutos
  13. 13
    Ejecutar código en Android (2/2)
    10 minutos
  14. 14
    Usando el log
    9 minutos
  15. 15
    Internacionalización y localización (1/2)
    9 minutos
  16. 16
    Internacionalización y localización (2/2)
    10 minutos
  17. 17
    Crear juegos con gdx-liftoff y libGDX
    7 minutos