2013-05-27 7 views
1

J'ai un GridLayout avec plusieurs boutons.Mettre à jour l'interface utilisateur sans geler

J'ai besoin de changer la couleur de chaque bouton dans une séquence, disons, toutes les 3 secondes.

J'ai un problème ici ... Jetez un oeil à mon code:

runnableScan = new Runnable() { 
    @Override 
    public void run() { 
     GridLayout view = Grid; 
     for (int i = 0; i < view.getChildCount(); i++) { 
      Button btn = (Button)view.getChildAt(i); 
      btn.setBackgroundColor(Color.RED); 
      handlerScan.postDelayed(this, 3000);           
     } 
    } 
};  
handlerScan.postDelayed(runnableScan, 3000);  

Eh bien .. il ne change la couleur de tous les boutons au rouge, mais il les change à la fois !!! Je voulais qu'il change les couleurs dans une séquence, un bouton toutes les 3 secondes.

Si je mets un Toast à l'intérieur, le Toast sera déclenché toutes les trois secondes avec l'index de chaque bouton.

Qu'est-ce que je fais mal? Pourquoi tous les boutons sont-ils changés en rouge à la fois?

+0

Etes-vous sûr que le 'Toast' est exécuté toutes les 3 secondes et vous n'êtes pas le voir jusqu'à ce que le précédent «Toast» soit rejeté? – codeMagic

+0

Juger du code que vous avez posté, il est en fait en train de changer la couleur de tous les boutons à la fois. Essayez de remplacer toast avec Log.d et comparez le timing avec les entrées logcat à nouveau. Toast peut vous donner l'illusion d'un délai parce que le second toast n'apparaîtra pas jusqu'à ce que le premier toast soit effacé. – TactMayers

+0

Bonjour codeMagic et TactMayers! Merci pour votre avis. En fait, Toast s'exécute toutes les trois secondes et affiche le texte (index) de chaque bouton. Étant donné que le texte Toast change, je suis sûr qu'il est déclenché toutes les trois secondes depuis qu'il a changé de texte. Des idées? –

Répondre

0

méthode run() du runnable est encore bouclez tous boutons et changer la couleur sur tous d'entre eux au cours d'un appel à run().

Cette ligne:

handlerScan.postDelayed(this, 3000);           

ne pas ajouter un délai entre les itérations de la boucle for. Il ne planifie que run() d'être appelé à nouveau, après 3 secondes. Essayez ceci (avec non pour la boucle).

runnableScan = new Runnable() { 
    @Override 
    public void run() { 

     GridLayout view = Grid; 
     Button btn = (Button)view.getChildAt(buttonIndex++); 
     if (btn != null) { 
      btn.setBackgroundColor(Color.RED); 
      handlerScan.postDelayed(this, 3000); 
     } 
    } 
    }; 
    handlerScan.postDelayed(runnableScan, 3000); 

Vous aurez besoin de garder une trace de buttonIndex comme variable membre dans votre classe:

private int buttonIndex; 

puis l'initialiser à l'index de votre premier bouton. Par exemple, si vous définissez votre point de vue du contenu en onCreate(), utilisez:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.some_layout_name); 

     GridLayout view = Grid; 
     for (buttonIndex = 0; buttonIndex < view.getChildCount(); buttonIndex++) { 
     View v = view.getChildAt(buttonIndex); 
     if (v instanceof Button) { 
      // we found the first button, so stop looping 
      break; 
     } 
     } 

     handlerScan = new Handler(); 

La façon dont le code que je vous ai montré fonctionne est que cela va changer le bouton 1 de couleur rouge, puis 3 secondes plus tard, le bouton de changement 2 rouge, puis 3 secondes plus tard, changez le bouton 3 en rouge. Si vous voulez recommencer le processus, il suffit de réinitialiser buttonIndex à l'index du premier bouton, après avoir terminé le changement du bouton 3.

+0

Bonjour Nate ...tout d'abord, merci pour votre réponse. Cela a beaucoup de sens. Je viens d'éditer mon code pour refléter vos sugestions. Quoi qu'il en soit, il semble que mon code attende les trois secondes et ensuite, il change TOUS les boutons en rouge. Notez que j'ai inséré ceci: handlerScan.postDelayed (this, 3000); à l'intérieur de la boucle. Même ainsi, il change tous les boutons en rouge à la fois. Des idées? Ça me rend fou!!! = P –

+0

Vous n'avez pas fait ce que j'avais précédemment suggéré. Vous étiez toujours en boucle sur les trois boutons. J'ai modifié ma réponse, pour montrer ** exactement ** ce que vous devriez utiliser. – Nate

+0

Bonjour Nate! Merci beaucoup! Cela a fait l'affaire! En outre, je viens d'apprendre un peu plus sur la façon dont les gestionnaires fonctionnent dans Android! Merci! –

Questions connexes