Diálogos
Un diálogo tiene el siguiente aspecto:
Aunque realmente es muy configurable, se puede añadir una lista en vez de texto, o incluso un diseño personalizado.
- Enlace a la documentación: https://developer.android.com/guide/topics/ui/dialogs?hl=es-419
- Enlace al proyecto: https://github.com/Manuel-Ag/PMD_19-20/tree/master/Dialogos
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:
- Ejemplo con más configuraciones de AlertDialog: https://github.com/Manuel-Ag/PMD_19-20/tree/master/Dialogos2
- https://es.wikipedia.org/wiki/Callback_(inform%C3%A1tica)
- http://codictados.com/android-callbacks/
- http://sourcenotas.blogspot.com/2009/07/callback-en-java.html