Ejecutar código de Android (1/2)

Cómo podemos hacer que en libGDX se ejecute código propio de Android, por ejemplo, cómo crear un Dialog de Android y hacer que se muestre a partir de algo que hagamos en libGDX.

Cuando trabajamos con LibGDX y queremos que nuestra aplicación se adapte de forma natural a cada plataforma, es fundamental integrar elementos nativos que respondan al sistema operativo en el que se ejecuta el juego. Un buen ejemplo de esto es la creación de diálogos nativos que se vean y funcionen como los propios del sistema, ya sea Android, Windows, Linux o Mac. Así, mejoramos la experiencia del usuario al ofrecer interfaces familiares y coherentes con su entorno.

Para lograr esto en Android, contamos con la clase DialogFragment, que nos permite mostrar diálogos dentro de una actividad sin necesidad de cambiar de pantalla. El método clave que debemos implementar es onCreateDialog, donde definiremos el diálogo que queremos presentar. Para construir el diálogo, utilizamos AlertDialog.Builder, un patrón builder que facilita la configuración de títulos, mensajes y botones.

Por ejemplo, podemos crear un diálogo que pregunte al usuario si está seguro de realizar una acción, con dos botones: uno positivo que diga Sí y otro negativo que diga No. Cada botón recibe un OnClickListener que nos permite manejar el evento cuando el usuario pulsa alguna opción. Así, podemos registrar en el log si el usuario ha respondido afirmativamente o negativamente.

public class PreguntaDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Atención, pregunta")
               .setMessage("¿Estás seguro de lo que quieres hacer?")
               .setPositiveButton("Sí", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       Gdx.app.debug("dialogue", "ha dicho que sí");
                   }
               })
               .setNegativeButton("No", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       Gdx.app.debug("dialogue", "ha dicho que no");
                   }
               });
        return builder.create();
    }
}

Para mostrar este diálogo desde nuestro código multiplataforma, definimos un método en la interfaz de plataforma, por ejemplo mostrarPregunta(), que implementaremos en el proyecto Android. En esta implementación, creamos una instancia de PreguntaDialogFragment y la mostramos usando el FragmentManager de la actividad:

@Override
public void mostrarPregunta() {
    PreguntaDialogFragment pregunta = new PreguntaDialogFragment();
    pregunta.show(getSupportFragmentManager(), "pregunta");
}

Es importante configurar el nivel de log para que podamos ver los mensajes de depuración en Android, ya que no contamos con una consola tradicional. Esto lo hacemos con:

Gdx.app.setLogLevel(Application.LOG_DEBUG);

De esta forma, cuando el usuario pulse el botón para mostrar la pregunta, aparecerá un diálogo nativo de Android con la pregunta y los botones Sí y No. Al pulsar cualquiera de ellos, se registrará en el log la respuesta correspondiente.

Sin embargo, para que esta interacción tenga sentido dentro del juego, necesitamos comunicar la respuesta del diálogo al código principal de LibGDX. Dado que Android funciona con eventos, la forma adecuada es implementar un listener personalizado que reciba la respuesta y la propague al juego. Esto implica crear interfaces y mecanismos para pasar estos eventos desde el diálogo hacia el núcleo del juego, manteniendo la separación entre la lógica multiplataforma y el código específico de Android.

Este proceso puede ser algo complejo, ya que requiere manejar eventos, listeners y sincronización entre capas, pero es fundamental para integrar diálogos nativos que interactúen correctamente con nuestro juego. En la siguiente parte, exploraremos cómo implementar este listener y cómo replicar un comportamiento similar en la versión de escritorio, asegurando que la experiencia sea coherente en todas las plataformas.

Mientras tanto, podemos disfrutar de tener un diálogo nativo en Android que responde a las acciones del usuario y que mejora la integración de nuestra aplicación con el sistema operativo. Esto es un paso importante para crear juegos y aplicaciones multiplataforma que se sientan realmente nativos y profesionales.

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