Venant de l'environnement .NET, je cherche maintenant à comprendre comment les dialogues fonctionnent dans Android.
Dans .NET, lorsque l'on appelle MessageBox.Show(...)
qui crée et affiche une boîte de dialogue contextuelle. Dans l'appel à Show, je peux spécifier les boutons qui doivent être disponibles dans la fenêtre pop-up, par exemple :
DialogResult myDialogResult = MessageBox.Show("My text here", "My caption here", MessageBoxButtons.YesNoCancel);
Comme vous pouvez le voir, l'appel à Show renvoie un DialogResult lorsqu'un bouton est pressé dans la fenêtre contextuelle, m'informant ainsi du bouton qui a été cliqué. Notez que dans .NET, l'exécution est arrêtée à la ligne où l'appel à Show(...)
est faite, afin qu'elle puisse renvoyer la valeur lorsqu'un bouton est pressé.
Si, dans l'exemple ci-dessus, j'appuie sur "Non", myDialogResult sera égal à
myDialogResult == DialogResult.No
Étant donné que je trouve la méthode .NET d'utilisation et de création des fenêtres contextuelles très facile et intuitive, j'aimerais que cette méthode de création des fenêtres contextuelles soit également utilisée dans Android.
Donc, la question est de savoir si quelqu'un sait comment "arrêter l'exécution" comme avec la fonction MessageBox.Show
puis retourner une valeur lorsque le bouton est pressé (et que la boîte de dialogue disparaît) ?
Edit 1
Pour être un peu plus clair :
J'ai besoin que l'exécution s'arrête et attende que l'utilisateur ait choisi un bouton à cliquer dans la popup. Le code qui suit l'appel pour afficher la fenêtre de dialogue dépend du bouton cliqué dans la fenêtre de dialogue.
C'est pourquoi je ne peux pas utiliser ce que Erich et Alex suggèrent, car écrire du code dans les méthodes onClick comme suggéré ci-dessous ne va pas fonctionner. La raison en est que je ne peux pas poursuivre l'"exécution normale". Prenons un exemple :
Laissez-moi prendre un exemple :
int nextStep = 0; // this variable will not be reached from within the onClick-methods
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Hello!")
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
nextStep = 1; // *** COMPILER ERROR!! ***
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
nextStep = 2; // *** COMPILER ERROR!! ***
}
})
.create().show();
if (nextStep == 1)
{
// then do some damage
}
else if (nextStep == 2
// dont do damage
Si je voulais que l'exécution dépende du choix dans la fenêtre popup, je devrais faire en sorte que toutes les variables de l'"exécution normale" (dans le cas présent nextStep
) disponibles dans les méthodes onClick, et ça me semble être l'enfer.
Edit 2
Un autre exemple évident serait une fenêtre pop-up demandant "Voulez-vous continuer" avec les options "Oui" et "Non" .
Si l'utilisateur appuie sur "Oui", toute la méthode doit être interrompue, sinon elle doit poursuivre son exécution. Comment résoudre ce problème ?
0 votes
Voir si le paragraphe ajouté par fupsduck aide
4 votes
Vous pouvez également concevoir votre "dialogue" comme une activité ayant le même aspect et la même convivialité qu'un dialogue. Si votre dialogue comporte beaucoup de logique, il pourrait être plus facile à mettre en œuvre de cette façon.
3 votes
En ce qui concerne la boîte de dialogue d'alerte, .NET est génial, et Android est nul. Dans certains cas, j'ai besoin de MessageBox pour faciliter le débogage. Dans .NET, le code qui suit la MessageBox ne s'exécute pas tant que vous n'avez pas fermé la MessageBox. Cependant, dans Android, cela ne fonctionne pas. Je pense que dans Windows, il y a une autre boucle de messages lors de l'affichage d'une boîte de dialogue modale. Dans Android, je pense que la fenêtre et le dialogue utilisent la même boucle de message.
0 votes
Au lieu d'avoir
If (nextStep == 1) { }
etIf (nextStep == 2) { }
vous devez avoir un vide appelé, disons,public void nextStep1
etpublic void nextStep2
qui sont appelés lorsque l'utilisateur clique sur un certain bouton. S'ils partagent le code après coup, vous pouvez créer un autre void qu'ils appellent chacun après coup avec le reste de votre code dedans.0 votes
Je pense que le gars d'Android @Romain Guy vient de dire que "vous ne devriez pas concevoir un programme qui a l'air beau et propre pour faire un choix et agir en fonction de ce choix". S'il y a une séquence de choix similaires et liés les uns aux autres, cela pourrait nécessiter 100 fois plus de lignes de code dans Android. Je ne sais pas quelle est la difficulté ou l'effet secondaire pour ajouter cela à la bibliothèque Android, mais je pense que c'est peut-être difficile pour eux.
0 votes
Vous pouvez l'utiliser pour afficher la boîte de dialogue et bloquer le fil d'arrière-plan : github.com/jrummyapps/blocking-dialog