IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

AlertDialog "bloquant" Android


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 24
    Points : 16
    Points
    16
    Par défaut AlertDialog "bloquant" Android
    Bonjour à tous, j'ai un problème avec les AlertDialog Android,

    en effet le projet sur lequel je suis est un jeu de plateau, un peu comme des dames, mais avec des tortues, à un moment donné selon la configuration,
    une alerte dialog s'ouvre et demande le choix de la couleur de la tortue à retourner. Le projet était sous Java et le projet veut qu'il soit porté sous Android,

    Pour l'alertDialog en java, il est bloquant donc aucun soucis, mais sous android, il continue a jouer alors que la couleur dans l'alertDialog n'a toujours pas été choisie,

    Aidez-moi svp je ne comprends pas trop comment solutionner le problème,

    Merci

  2. #2
    Membre éclairé
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Points : 832
    Points
    832
    Par défaut
    Tu veux "bloquer" quoi ?
    C'est pas très clair ton problème.
    "Quand la lune n'est pas là, la nuit mène une existence obscure"

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Bonjour, et bien "bloquer" le code, enfin avec l'alertDialog faire en sorte que une fois ma méthode choix appelée (alertDialog), tant que le choix n'est pas fait, le code ne continue pas,

    en gros dans mon code, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    onTouchEvent(Event) {
     
    si (tortue doit être retournée)
        choix = choixTortue(...)
        retournerTortue(choix);
    }

  4. #4
    Membre éclairé
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Points : 832
    Points
    832
    Par défaut
    Tu peux essayer quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    onTouchEvent(Event) {
     if(!alert.isShowing()){
    si (tortue doit être retournée)
        choix = choixTortue(...)
        retournerTortue(choix);
    }
    }
    "Quand la lune n'est pas là, la nuit mène une existence obscure"

  5. #5
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Et bien... arrête-le dans ce cas

    A mon sens, de base, ton code a un problème, celui-ci n'attendant pas un code retour quelconque, mais étant bloqué tant que celui-ci n'a pas été retourné. Il y a une nuance : d'un coté, plus de déroulement de code, et c'est en attente passive d'une entrée utilisateur, de l'autre, le code est bloqué et c'est en attente semi-active d'une entrée utilisateur.

    Il suffit que tu arrêtes ton jeu lorsque tu dois ouvrir l'AlertDialog, et que la sélection de celle-ci le fasse reprendre.

    Ps : pense aussi au bouton "retour"

    EDIT : Quand même... de base, il ne faut jamais geler l'UI, où faire faire une attente active à un quelconque thread. Ici, la boucle principal doit réagir à un événement, elle ne doit pas l'attendre.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Bonsoir à vous et merci pour vos réponses,

    Que je parte de l'une de vos réponses, j'arrive au même problème, je pense que le code de base n'est pas optimisé,

    voici le vrai :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    public boolean onTouchEvent(MotionEvent evt) {
     
    		if (evt.getAction() == MotionEvent.ACTION_DOWN) {
    			int x = (int) evt.getX();
    			int y = (int) evt.getY();
    			boolean terminee = affTerminee && isTerminerClick(x, y);
     
    			byte numTor = tortueClique((int) evt.getX(), (int) evt.getY());
    			if ((numTor != -1 && !oeufT && !oeufC) && cliquePossible(numTor)) {
    				if (clTor1 == -1 && confTab[numTor] == conf.getPlayer()) {
    					clTor1 = numTor;
    					tcercle.clear();
    					tcercle.add(numTor);
    					for (byte[] poss : conf.verifCoupObligatoire()) {
    						if (Configuration.en37(poss[0]) == numTor) {
    							transTortue.add(new byte[] {
    									Configuration.en37(poss[2]),
    									Configuration.en37(poss[0]), poss[1] });
    						}
    					}
    					if (transTortue.isEmpty()) {
    						for (byte[] poss : conf.possibleMove(
    								Configuration.en81(numTor), (byte) 0)) {
    							transTortue.add(new byte[] {
    									Configuration.en37(poss[2]),
    									Configuration.en37(poss[0]), poss[1] });
    						}
    					}
    					invalidate();
    				} else if (clTor1 != -1) {
    					if (clTor2 == -1) {
    						clTor2 = numTor;
    						confTab[clTor2] = confTab[clTor1];
    						confTab[clTor1] = 0;
    						boolean a = false;
    						for (byte[] coup : transTortue) {
    							if (clTor1 == coup[1] && clTor2 == coup[0]) {
    								if (coup[2] == 3) { // Si l'on doit
    													// retourner une tortue
    									conf.coupJoue(Configuration.en81(clTor1),
    											choixTortue(),
    											Configuration.en81(clTor2));
     
    								} else if (coup[2] != 0) {
    									conf.coupJoue(Configuration.en81(clTor1),
    											coup[2], Configuration.en81(clTor2));
    									tcercle.clear();
    									saute = coup[2];
    									clTor1 = clTor2;
    									clTor2 = -1;
    									a = true;
    								} else {
    									conf.coupJoue(Configuration.en81(clTor1),
    											(byte) 0,
    											Configuration.en81(clTor2));
    									saute = 0;
    									a = true;
    								}
    							}
    						}
    						transTortue.clear();
     
    						if (saute > 0) {
    							for (byte[] poss : conf.possibleMove(
    									Configuration.en81(clTor1), saute)) {
    								transTortue.add(new byte[] {
    										Configuration.en37(poss[2]),
    										Configuration.en37(poss[0]), poss[1] });
    							}
    							if (transTortue.isEmpty()) {
    								saute = -1;
    								clTor1 = -1;
    								clTor2 = -1;
    								conf.changePlayer();
    								affPossibleMove();
    							}
    						} else if (!a) {
    							clTor1 = -1;
    							clTor2 = -1;
    							affPossibleMove();
    						} else {
    							clTor1 = -1;
    							clTor2 = -1;
    							conf.changePlayer();
    							tcercle.clear();
    							if (multi) {
    								affPossibleMove();
    							}
    							saute = -1;
     
    						}
    						verifWin();
    						invalidate();
    					}
    				}
     
    			}
    			if (!multi && conf.getPlayer() == 2 && !win && !threadD) {
    				// conf.printHexRV();
    				threadD = true;
    				Swingworker sw = new Swingworker();
    				sw.execute();
     
    			}
    		}
    		return true;
    	}
    en ligne 41, le choix de la tortue va être demandé, et sa, je ne peux le stopper,

    j'avais au départ d'un début de solution, mis, à la place d'appeler le conf.coupJoue(Configuration.en81(clTor1),
    choixTortue(),
    Configuration.en81(clTor2));

    un booléen choix à true et faisait un return, j'ai donc rajouté un if dans mon onTouch comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    if (choix == true) {
    			if (evt.getAction() == MotionEvent.ACTION_DOWN) {
    				int x = (int) evt.getX();
    				int y = (int) evt.getY();
    				isChoixClick(x, y);  //choix de la tortue par AlertDialog Perso
     
    				if (choixTortue != 0) {
    					conf.coupJoue(Configuration.en81(clTor1), choixTortue,
    							Configuration.en81(clTor2));
     
    					choixTortue = 0; // remise a niveau
    					choix = false;
    				}
     
    			}
    		} else { //le code cité au dessus
    et donc la j'étais obligé de cliquer sur un des choix (mon isChoixClick est un alertDialog personnalisé fait de deux tortues, le code est plus simple à comprendre pour vous) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    private byte isChoixClick(int x, int y) {
    		Rect recTortueRouge = new Rect((int) (xChoixRouge),
    				(int) (yChoixRouge), (int) (xChoixRouge) + tailleTortueChoix,
    				(int) (yChoixRouge) + tailleTortueChoix);
    		Rect recTortueVerte = new Rect((int) (xChoixVerte),
    				(int) (yChoixVerte), (int) (xChoixVerte) + tailleTortueChoix,
    				(int) (yChoixVerte) + tailleTortueChoix);
     
    		if (recTortueRouge.contains(x, y)) {
    			choixTortue = 1;
    			choix = false;
    			invalidate();
    			return choixTortue;
    		}
    		if (recTortueVerte.contains(x, y)) {
    			choixTortue = 2;
    			choix = false;
    			invalidate();
    			return choixTortue;
    		}
    		return choixTortue;
    	}
    Tout fonctionne bien, mais j'ai abandonné cette idée car mon application plantait, en effet, il faudrait que j'arrive à me replacer dans le

    if (coup[2] == 3) { // Si l'on doit
    // retourner une tortue
    conf.coupJoue(Configuration.en81(clTor1),
    choixTortue(),
    Configuration.en81(clTor2));

    }

    pour pouvoir finir correctement mon touchEvent... Avez-vous des idées ?

    Merci d'avance

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Bonsoir, c'est bon, j'ai réussi à m'en sortir ouf, merci quand même

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo