Link

Diálogos

Un diálogo tiene el siguiente aspecto:

Android

Aunque realmente es muy configurable, se puede añadir una lista en vez de texto, o incluso un diseño personalizado.

Como se puede apreciar, la clase DialogFragment hereda de Fragment, por lo que parte de lo aprendido se puede aplicar a los diálogos. Para empezar, simplemente debemos de heredar de la clase DialogFragment:

public class Dialogo extends DialogFragment {
    Respuesta respuesta;

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        //Utilizamos esta clase para crear el diálogo
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Título diálogo");
        builder.setMessage("Este será el mensaje a mostrar");
        //Botón positivo
        builder.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //Llamo a la implementación en MainActivity.java
                respuesta.onRespuesta("A");
            }
        });
        builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.i("Prueba", "funciono");
            }
        });

        return builder.create();
    }
}	

La clase AlertDialog permite configurar el diálgo con el aspecto que deseemos. En este caso hemos utilizado únicamente dos botones, añadidos mediante los métodos setPositiveButton() y setNegativeButton() de la clase AlertDialog.Builder, aunque sería posible incluir un tercer botón con setNeutralButton(). Para ver la utilización de estos métodos podemos consultar la documentación de la clase AlertDialog.Builder: https://developer.android.com/reference/android/app/AlertDialog.Builder.html?hl=es-419

Para recibir información de vuelta a la actividad principal se ha implementado la solución propuesta en la documentación oficial: https://developer.android.com/guide/topics/ui/dialogs?hl=es-419 a partir de la sección Cómo pasar eventos de vuelta al host del diálogo. Para ello se propone utilizar callbacks.

Se han seguido los siguientes pasos:

1. Se añade el siguiente código a la clase Dialogo:

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        respuesta = (Respuesta) context;
    }

    /**
     * Declaración de la interface que se ejecutará al pulsar los botones
     */
    public interface Respuesta {
        //Los métodos en las interfaces solo están declarados
        public void onRespuesta(String s);
    }

Como se puede observar, se implementa el método onAttach(), el cual asigna valor a respuesta y se define la interface Respuesta(), con el método onRespuesta().

2. Se llama al método de la interface: Observa cómo cuando se pulsa un botón se llama al método de la interface Respuesta, aun no habiéndose implementado.

builder.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //Llamo a la implementación en MainActivity.java
            respuesta.onRespuesta("A");
        }
});

3. Implementa la interface en la clase principal: Esto obligará a implementar los métodos de la interface, los cuales serán llamados cuando se pulse en el botón:

public class MainActivity extends AppCompatActivity implements Dialogo.Respuesta{

    ...

    @Override
    public void onRespuesta(String s) {
        Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
    }
}

En este caso muestra en una tostada el valor recibido por parámetro.

Ver también: