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 :

Problème mise à jour UI


Sujet :

Android

  1. #1
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut Problème mise à jour UI
    Bonjour,

    j'éprouve quelques problèmes pour la mise à jour de mes vues sur Android.

    Je réalise un petit quiz, lorsque l'on clique sur la bonne réponse je change la couleur en vert.

    En cas de mauvaise réponse je veux colorier en rouge la réponse sélectionné et en vert la bonne réponse.

    Cependant seul le bouton rouge se met à jour. Je rentre pourtant bien dans la condition.

    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
     
    ...
    	private Button m_sol1, m_sol2, m_sol3;
    ...
     
    private View.OnClickListener buttonListener = new View.OnClickListener() 
        {
    		@Override
    		public void onClick(View v) 
    		{
    			Button b = (Button) v;
    			// Correct response.
    			if (m_currentQuestion.getCorrect().equals(b.getText()))
    			{
    				b.getBackground().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY);
     
                                // Lock button during the wait.
    				lock(true);
                                // Wait for new question.
    				Handler handler = new Handler(); 
    			    handler.postDelayed(new Runnable() { 
    			         public void run() { 
    			              newQuestion(); 
    			         } 
    			    }, 500); 	
    			}
     
    			// Bad response.
    			else
    			{			
    				b.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
     
    				// Lock usage of bouton.
    				lock(true);
     
    				// Colorise the good response.
    	       		if (m_currentQuestion.getCorrect().equals(m_sol1.getText()))
    	    		{
    	    			m_sol1.getBackground().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY);
    	    		}
    	    		else if (m_currentQuestion.getCorrect().equals(m_sol2.getText()))
    	    		{
    	    			m_sol2.getBackground().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY);
    	    		}
    	    		else
    	    		{
    	    			m_sol3.getBackground().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY);
    	    		}
    			// wait 1 sec before lauch newQuestion.
    			    Handler handler = new Handler(); 
    			    handler.postDelayed(new Runnable() { 
    			         public void run() {
    			        	 newQuestion(); 
    			         } 
    			    }, 1000); 
    			}
    		}
    	};
    Je ne comprends pas d’où vient l'erreur ?

    Merci de votre aide.

    p.s. j'arrive à une solution si je met tout mon code dans newquestion(); mais j'aimerai bien pouvoir le mettre dans le onClick().

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    C'est quoi "lock(true)" ?

    Sinon, il faut peut etre faire un "invalidate" sur le bouton modifié... je ne suis pas sur que le background sache notifier le bouton qu'un redraw est nécessaire (mais je peux me tromper).

    Sur le bouton cliqué, il n'y a pas de probleme, puisqu'Android va faire un invalidate apres le onClick....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Ça marche avec le invalidate(); c'était exactement ça.

    Sinon j'ai fait la méthode lock(); afin de bloquer les boutons pendant le wait. C'est plus agréable pour l'utilisateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void lock(boolean _state)
    	{
    	m_lock = _state;
    	m_sol1.setClickable(!_state);
    	m_sol2.setClickable(!_state);
    	m_sol3.setClickable(!_state);
    }

    Merci beaucoup

  4. #4
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Je rencontre de nouveau un problème avec ce cas, ça fonctionne très bien avec les boutons de bases, mais pas avec des boutons personnalisé. J'ai remarqué déjà que je suis obligé d'ajouter un invalidate après le onclick, car il ne se fait plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        <Button
            android:id="@+id/sol2"
            android:layout_width="fill_parent"
            android:layout_height="80dp"
            android:background="@drawable/button_standard_v1"
            android:layout_marginTop="15dp"
        />
    Et le code de l'activity :

    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
    else
    {	
    	b.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
    	b.invalidate();
    	// Lock usage of bouton.
    lock(true);
     
    // Check the right question.
    if (m_currentQuestion.getCorrect().equals(m_sol1.getText()))
    {
    	m_sol1.getBackground().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY);
    	m_sol1.invalidate();
    }
    else if (m_currentQuestion.getCorrect().equals(m_sol2.getText()))
    {
    	m_sol2.getBackground().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY);
    	m_sol2.invalidate();
    }
    else
    {
    	m_sol3.getBackground().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY);
    	m_sol3.invalidate();
    }
    Ce que je ne comprend pas c'est que seul la dernière couleur est appliqué, mais pas uniquement à un bouton, mais à plusieurs boutons selon se schéma.

    Si j'attends :
    [bouton 1] vert
    [bouton 2]
    [bouton 3] rouge

    -> ça affiche

    [bouton 1] vert
    [bouton 2] vert
    [bouton 3] vert

    2ème cas si j'attends :

    [bouton 1]
    [bouton 2] vert
    [bouton 3] rouge

    -> ça affiche

    [bouton 1]
    [bouton 2] vert
    [bouton 3] vert

    Pourquoi le fait d'utiliser une image personnalisé sur mon bouton modifie le comportement du programme.

    Quelqu'un aurait-il une solution ?

    Merci

    [EDIT]

    J'ai trouvé d'où vient l'erreur mais aucune idée de comment la réparer proprement.

    En fait ma modification ne se fait plus sur l'image, mais sur la ressource (@drawable/button_standard)...

    Est-ce qu'il existe une autre solution que de créer 3 copies de l'image ?

    [/EDIT]

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    mutate() ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Merci encore une fois.

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Comme j'aime bien les solutions "style driven" (donc tout dans les ressources):
    Une autre solution aurait été de proposer un checkable button... Avec comme background un selector vers le drawable de base (si pas checked) le drawable plus vert (ou rouge) si checked.... Donc:

    3 drawables:
    Un drawable "unchecked"
    Deux drawable "stack" green/red.... (avec le 'unchecked' en bas de la stack)... Par exemple:
    R.drawable.unchecked_response = bitmap
    R.drawable.checked_ok_response = stack (R.drawable.unchecked_response, green_color [shape] )
    R.drawable.checked_bad_response = stack (R.drawable.unchecked_response, red_color [shape] )

    Quand un bouton est "clicked", on vérifie si c'est la bonne réponse... si c'est le cas, on passe le background du bouton a R.drawable.checked_ok_response... Sinon, on passe le background du bouton a R.drawable.checked_bad_response et on le bouton de la bonne réponse a R.drawable.checked_ok_response

    Plus besoin de mutate, plus besoin d'invalidate, ...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    J'y avais pensé, je pensais que la couleur ne pourrait pas être mise sur un bouton personnalisé.

    J'avais d'ailleurs déjà préparé mes trois boutons, mais en faisant mes tests d'affichage j'ai vu que la couleur pouvait être mise directement

    Quel serait l'avantage d'une tel solution ? Plus de performances ? Je pense qu'il y a déjà moins d'utilisation de mémoire (3 images, plutôt que 4).

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

Discussions similaires

  1. Problème Mise à Jour de Table
    Par pignouflolo dans le forum Access
    Réponses: 8
    Dernier message: 21/07/2006, 15h34
  2. Réponses: 6
    Dernier message: 29/05/2006, 14h22
  3. Problème mise à jour onglet
    Par auriolbeach dans le forum Access
    Réponses: 1
    Dernier message: 25/12/2005, 13h10
  4. Problème mise à jour vers IE6 sous W2K
    Par lio33 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 11/10/2005, 11h51
  5. [HTML] Problème mise à jour des fichiers en cache
    Par El Riiico dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 05/09/2005, 17h00

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