12
votes

Dialogue de confirmation Android retourne vrai ou faux

Il semble que ce soit il n'y a pas de moyen facile d'obtenir une boîte de dialogue d'alerte pour renvoyer une valeur simple.
Ce code ne fonctionne pas strud> (la variable réponse em> ne peut pas être défini de l'auditeur, il ne compile même pas)

dialog.setButton(int buttonId, String buttonText, Message msg)


0 commentaires

8 Réponses :


0
votes

Déclarez un champ 'Réponse' dans votre activité et définissez une valeur pour elle. Les champs d'une classe sont visibles pour les classes intérieures, vous pouvez donc le faire.


1 commentaires

Oui .. Je n'ai pas mentionné cela, mais j'ai besoin que la méthode soit indépendante de la classe, elle est définie. Impossible d'utiliser une variable de classe. Je vais mettre à jour la question pour le rendre plus clair.



5
votes

Ce que vous pouvez faire est de créer un auditeur pour votre boîte de dialogue d'alerte qui répercèlent l'action d'alerteDialogs à l'aide d'une interface.

Créer une interface. P>

public class Main extends Activity implements MyInterface.DialogReturn{

    MyInterface myInterface;
    MyInterface.DialogReturn dialogReturn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                ....
        myInterface = new MyInterface();
        myInterface.setListener(this);
    }


   public void Confirm(Context context) {
        AlertDialog dialog = new AlertDialog.Builder(context).create();
        dialog.setTitle("Confirmation");
        dialog.setMessage("Choose Yes or No");
        dialog.setCancelable(false);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int buttonId) {
                myInterface.getListener().onDialogCompleted(true);
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int buttonId) {
                myInterface.getListener().onDialogCompleted(false);
            }
        });
        dialog.setIcon(android.R.drawable.ic_dialog_alert);
        dialog.show();
         }


@Override
    public void onDialogCompleted(boolean answer) {
        Toast.makeText(Main.this, answer+"", Toast.LENGTH_LONG).show();
            if(answer)
            // do something
            else
            // do something
    }
}


3 commentaires

Je suppose que votre suggestion fonctionne. Mais quelle manière compliquée d'atteindre une chose simple! Tu ne penses pas?


Ya True, mais ce n'est pas si compliqué si nous le comprenons une fois et que nous l'obtenons de travailler.


@ilomambo Bienvenue à Android! Bienvenue à Java pour cette affaire.



10
votes

Eh bien, j'allais dire que je suis très satisfait de moi parce que j'ai trouvé une réponse simple, tout seul!
Mais la vérité est que bien que je trouve un moyen de retourner une valeur (que je montre ci-dessous). il est d'aucune utile .

Le vrai problème est que je voulais une boîte de dialogue synchrone, une boîte de dialogue qui attend que l'utilisateur réponde avant de reprendre votre code après la boîte de dialogue () .
Il n'y a pas de telle bête dans Android . Tous les dialogues sont asynchrones, donc dialog.show () ne pose que la boîte de dialogue dans une queue (je pense) et continue. Ainsi, vous n'obtenez pas votre réponse à temps.

Pour toute sa valeur (rien) ci-dessous, vous trouverez comment définir une valeur dans la méthode qui construit la boîte de dialogue. Peut-être qu'il y a d'autres utilisations pour cette technique, non liées au cycle de vie de dialogue.




Pour donner des informations connexes, je dirai que Si vous remplacez xxx

avec xxx

Il est possible d'accéder à la variable de l'auditeur, mais ce n'est pas possible de lui attribuer une nouvelle valeur, car elle a été déclarée comme finale .

voici le tour.
Définissez la variable comme suit: xxx

Certains d'entre vous voient déjà pourquoi cela fonctionnera. La variable finale ici n'est pas l'élément unique de la matrice booléenne, est la matrice elle-même.
Alors maintenant, vous pouvez affecter l'élément de tableau [0] comme vous le souhaitez. xxx

et enfin, vous pouvez le retourner à partir de votre méthode.


5 commentaires

Vous avez déjà trouvé une meilleure solution?


@ Lion789 Comme je l'ai dit, ce n'est pas vraiment une solution et j'ai expliqué pourquoi avec le système d'exploitation Android actuel, il ne peut y avoir une soultion. Donc, bref, je n'ai pas trouvé de meilleure solution. Selon Android, vous devez mettre votre code à l'intérieur de l'auditeur OnClick () pour la boîte de dialogue. C'est le seul moyen de l'exécuter après avoir fermé la boîte de dialogue.


ilomambo avez-vous essayé celui de haut en haut avec appel annulable


J'ai déménagé depuis dans d'autres projets, je n'ai donc pas essayé. Mais si vous comprenez ma réponse, c'est assez évident comment ça va se comporter. En raison du caractère asynchrone de Android, le moment où vous appelez show () la boîte de dialogue s'affiche et le code passe sur , il n'attend pas Pour l'utilisateur, cliquez sur ok


droite, mais s'il n'y a rien d'autre dans le code, mais par exemple onclick (dialogue (ProCA (), PROCB ()), l'écran ne changera que après une sélection indépendamment de l'ASYNC, car dans ProCA I Dites-le quoi faire et ce n'est pas exécuté Sauf s'il est dit de courir dans la boîte de dialogue



17
votes

J'ai posté problème similiaire dans ce forum, mais enfin, j'ai ma réponse. Mon problème dans cet article est de créer une classe de dialogue de confirmation distincte qui peut accéder par une autre classe ou par une autre activité, de sorte que confirmez la classe de dialogue que nous n'avons pas besoin d'écrire de long codage.

Voici ma réponse.

Vous devez d'abord créer dialoghandler.java xxx

et il s'agit d'exemple pour l'appeler dans une autre classe xxx


4 commentaires

@ Lion789 Voir ma réponse à votre commentaire dans ma propre réponse. Le test réel ici est: Mettez un certain code dans le onclick () méthode après Invoquant DOCLICK () Pour vérifier la réponse de l'utilisateur au DialogHandler dialogue et voyez si cette exécution de code attend que la boîte de dialogue se ferme. Je pense que ce ne sera pas.


J'aime votre approche et c'est courir. Je l'ai vérifié.


@Roro excellent travail. Ça marche. Cela devrait être la réponse acceptée


@Aseproro belle logique..works gentiment. Celui-ci doit en effet être la réponse acceptée.



0
votes

Je me lance également pour utiliser une boîte de dialogue de blocage de la confirmation et je l'ai enfin fait à l'aide d'un blockingQueue: xxx


0 commentaires

1
votes

Je trouve que l'utilisation de JDeferred aide dans les cas où vous souhaitez attendre l'entrée.

IT est essentiellement équivalent à l'utilisation d'une interface, mais vous créez plutôt des gestionnaires effectués et échoués. Juste une alternative à considérer: xxx

implémentation: xxx


0 commentaires

1
votes

avec andriod, ce n'est pas une bonne idée de bloquer le fil d'exécution en attendant que l'utilisateur dise «oui» ou «non».

Pour demander une confirmation, vous pouvez définir une méthode qui reçoit un ASYNTASK. La méthode exécute cette tâche si l'utilisateur appuyait sur le bouton de confirmation. P>

par exemple: p> xxx pré>

Vous pouvez l'appeler de votre activité avec: p >

 YourTask yourTask =  new YourTask( ... );
 confirm( YourActivity.this, 
         "Confirm", 
         "Are you sure?", 
         "Cancel", 
         "Continue", 
         yourTask,
         null);


0 commentaires

0
votes

J'ai essayé toutes les solutions et plus facile et plus propre est de loin la première solution avec le runnable, à mon avis. Il prend en charge la boîte de dialogue sur l'écouteur de boutons Annuler, l'ONBACKPRESSED () et l'OnOptionsItemselected ().

Le code comme décrit si cela appelle l'ANS_FALSE.RUN (); Lorsque vous cliquez sur la touche_positive et l'ANS_TRUE.RUN (); Lorsque vous cliquez sur la touche_negative.

Voici le code que j'ai utilisé pour résoudre ce problème: xxx

}


0 commentaires