Pour mon application MIDI, j'avais besoin de dialogues de confirmation oui/non/annuler, donc j'ai d'abord créé une classe StandardDialog générale :
public class StandardDialog {
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Handler;
public class StandardDialog {
public static final int dlgResultOk = 0;
public static final int dlgResultYes = 1;
public static final int dlgResultNo = 2;
public static final int dlgResultCancel = 3;
public static final int dlgTypeOk = 10;
public static final int dlgTypeYesNo = 11;
public static final int dlgTypeYesNoCancel = 12;
private Handler mResponseHandler;
private AlertDialog.Builder mDialogBuilder;
private int mDialogId;
public StandardDialog(Activity parent,
Handler reponseHandler,
String title,
String message,
int dialogType,
int dialogId) {
mResponseHandler = reponseHandler;
mDialogId = dialogId;
mDialogBuilder = new AlertDialog.Builder(parent);
mDialogBuilder.setCancelable(false);
mDialogBuilder.setTitle(title);
mDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert);
mDialogBuilder.setMessage(message);
switch (dialogType) {
case dlgTypeOk:
mDialogBuilder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mResponseHandler.sendEmptyMessage(mDialogId + dlgResultOk);
}
});
break;
case dlgTypeYesNo:
case dlgTypeYesNoCancel:
mDialogBuilder.setPositiveButton("Oui", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mResponseHandler.sendEmptyMessage(mDialogId + dlgResultYes);
}
});
mDialogBuilder.setNegativeButton("Non", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mResponseHandler.sendEmptyMessage(mDialogId + dlgResultNo);
}
});
if (dialogType == dlgTypeYesNoCancel) {
mDialogBuilder.setNeutralButton("Annuler", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mResponseHandler.sendEmptyMessage(mDialogId + dlgResultCancel);
}
});
}
break;
}
mDialogBuilder.show();
}
}
Ensuite, dans mon activité principale, j'avais déjà un gestionnaire de message pour les mises à jour de l'interface utilisateur à partir d'autres threads, donc j'ai simplement ajouté du code pour traiter les messages des dialogues. En utilisant un paramètre dialogId différent lorsque j'instancie le StandardDialog pour diverses fonctions du programme, je peux exécuter le code approprié pour gérer les réponses oui/non/annuler à différentes questions. Cette idée peut être étendue pour les dialogues personnalisés complexes en envoyant un Bundle de données, mais c'est beaucoup plus lent qu'un simple message entier.
private Handler uiMsgHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg != null) {
// {Code pour vérifier d'autres messages d'interface utilisateur ici}
// Vérifier les réponses des boîtes de dialogue
if (msg.what == (clearDlgId + StandardDialog.dlgResultYes)) {
doClearDlgYesClicked();
}
else if (msg.what == (recordDlgId + StandardDialog.dlgResultYes)) {
doRecordDlgYesClicked();
}
else if (msg.what == (recordDlgId + StandardDialog.dlgResultNo)) {
doRecordDlgNoClicked();
}
}
}
};
Ensuite, tout ce que j'ai besoin de faire est de définir les méthodes do{Quelquechose}() dans l'activité. Pour afficher une boîte de dialogue, par exemple j'ai une méthode répondant à un bouton "effacer les événements MIDI enregistrés" et la confirmer comme suit :
public void onClearBtnClicked(View view) {
new StandardDialog(this, uiMsgHandler,
getResources().getString(R.string.dlgTitleClear),
getResources().getString(R.string.dlgMsgClear),
StandardDialog.dlgTypeYesNo, clearDlgId);
}
clearDlgId
est défini comme un entier unique ailleurs. Cette méthode fait apparaître une boîte de dialogue Oui/Non devant l'activité, qui perd le focus jusqu'à ce que la boîte de dialogue se ferme, à ce moment-là l'activité reçoit un message avec le résultat de la boîte de dialogue. Ensuite, le gestionnaire de messages appelle la méthode doClearDlgYesClicked()
si le bouton "Oui" a été cliqué. (Je n'avais pas besoin d'un message pour le bouton "Non" car aucune action n'était nécessaire dans ce cas).
Quoi qu'il en soit, cette méthode fonctionne pour moi, et rend facile de transmettre les résultats d'une boîte de dialogue.