Crear dialogos personalizados en Android

Buenas lectores, con el desarrollo de ThiefBusters, el juego que estamos creando para Android, cada día nos encontramos con retos más grandes, hace unos días tenía la misión de crear un diálogo para pedir los datos al usuario cuando fuese la primera vez que jugara y aprendí como hacer un diálogo personalizado y que se mostrara y funcionara. En este tutorial os enseñaré como lo hice para que os pueda servir aunque daré por hecho que ya sabéis programar en Java, hacer Layouts para Android y tenéis algo de idea en lo que respecta a un Evento y su captura.

Lo primero que tenéis que tener claro es que un diálogo es un proceso distinto al programa principal así que cuando lo llamemos tendremos que tener en cuenta que las sentencias siguientes se ejecutarán con normalidad.

Ahora, realizamos un layout, a ser posible relativo y ponemos en el lo que queremos que aparezca. Aquí os dejo el Layout en cuestión que hicimos para el diálogo:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <TextView
        android:id="@+id/welcome"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="EEEEE"
        android:textSize="20dp"
        android:layout_marginTop="12dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="EEEEE"
        android:layout_below="@+id/welcome"
        android:layout_centerHorizontal="true" />
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/welcome"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="5dp"
        android:text="" />
    <EditText
        android:id="@+id/nameBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text=""
        android:layout_marginTop="11dp"
        android:layout_below="@+id/name"
        android:layout_centerHorizontal="true" />
    <TextView
        android:id="@+id/sex"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:text="WWWWWWWWW"
        android:layout_below="@+id/nameBox"
        android:layout_centerHorizontal="true" />
    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/name"
        android:layout_alignStart="@+id/name"
        android:layout_below="@+id/sex"
        android:layout_marginTop="25dp"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/girl"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:checked="true"
            android:layout_alignBaseline="@+id/boy"
            android:layout_alignBottom="@+id/boy"
            android:layout_alignRight="@+id/textView"
            android:layout_alignEnd="@+id/textView" />
        <RadioButton
            android:id="@+id/boy"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:layout_below="@+id/sex"
            android:layout_toRightOf="@+id/textView"
            android:layout_toEndOf="@+id/textView" />
    </RadioGroup>
</RelativeLayout>

Detalle, la razón por la que los textos son así es porque luego los cambiamos dinámicamente.

 Luego de tener el layout bien definido creamos una clase con el nombre que queramos y la extendemos de DialogFragment (ojo DialogFragment de android.app)

public class NewUserDialog extends DialogFragment

Luego sobrescribimos el método onCreateDialog al que le pasamos un Bundle y que devuelve un Dialog (que no DialogFragment). Aquí la cosa se complica pero voy a intentar explicarlo lo mejor posible.

Lo primero que tenemos que hacer es definir que Layout vamos a usar. Lo hacemos con esta línea.

 final View content = getActivity().getLayoutInflater().inflate(R.layout.dialog_new_user,null);

Obviamente el layout será con el nombre que sea.

Sobre la constante content haremos las funciones para seleccionar partes del layout:

content.findViewById(R.id.welcome);

Y todas las cosas referentes al manejo dinámico del layout.

Una vez que hayamos modificado lo necesario el layout de manera dinámica hacemos lo siguiente.

Creamos un nuevo AlertDialog.Builder (nuevamente de android.app)

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

Y ahora creamos el dialogo con el siguiente juego de instrucciones:

builder.setView(content)
                // Add action buttons
                .setPositiveButton(""/*Mensaje para el botón positivo*/, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        //Código para cuando se haga click en positivo
                    }
                })
                .setNegativeButton(""/*Mensaje para el botón negativo*/, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        //Código para cuando se haga click en negativo
                    }
                });
return builder.create();

Recordad que es asíncrono, por lo que tener cuidado si se espera algo del diálogo poner eso en los onClick y no después de abrirlo.

Ahora, tras generar el cuadro de diálogo tendremos que mostrarlo, pues bien, así es como lo coseguí.

Nos vamos a la clase donde se mostrará el diálogo (la clase debe disponer del método getFragmentManager()) y en el momento en el que queramos que se muestre el diálogo hacemos lo siguiente.

DialogFragment d = new NewUserDialog(); //Instanciamos la clase con el dialogo
d.setCancelable(false);//Hacemos que no se pueda saltar el dialogo (opcional)
d.show(getFragmentManager(), "NEWUSER"/*Tag que particularmente no le he encontrado utilidad*/); //Mostramos el dialogo

Y así ya tenemos un diálogo en la pantalla.

Si alguno de los pasos no está claro, has conseguido hacerlo de otra forma o hay algo erróneo no ovlides dejarlo en los comentarios. Dale me gusta si te ha ayudado y comparte por las redes sociales, muchas gracias por leernos y nos vemos en el próximo artículo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *