Stilgardt Posté(e) 17 octobre 2009 Share Posté(e) 17 octobre 2009 Bonsoir, Je bloque (encore) sur un problème et j'en appelle aux bonnes âmes qui trainent ici! :D (j'ai espoir aussi de bientôt pouvoir aider à mon tour! :) ) Voici ce que j'essaie de faire: Sur un clic de bouton, j'affiche une image puis, quelque secondes après, une autre image doit remplacer la première. Voici en gros le code que j'ai fait: View.OnClickListener my_listener = new OnClickListener() { public void onClick(View view) { ImageView my_image = (ImageView) findViewById(R.id.ImageView1); double index = 0; my_image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.image01)); for(index=0;index<99999;index++) { } my_image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.image02)); } Ca m'avait l'air assez compliqué d'utiliser await pour faire une boucle d'attente donc j'ai préféré faire à l'ancienne avec un bon "for(...)" ... :P Ce qui se passe, c'est que j'ai image02 qui s'affiche mais je ne vois jamais image01. Est-ce que l'affichage ne se réalise seulement une fois que l'on sort du OnClickListener ? :/ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fluckysan Posté(e) 17 octobre 2009 Share Posté(e) 17 octobre 2009 Jette un coup d'oeil du côté des threads Tu lances un thread et dedans tu fais ton wait puis tu remplaces l'image :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
popolbx Posté(e) 17 octobre 2009 Share Posté(e) 17 octobre 2009 ou tu programme une alarme. .. -- Posté depuis BBFoC Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Stilgardt Posté(e) 17 octobre 2009 Auteur Share Posté(e) 17 octobre 2009 Merci pour vos réponses rapides! :) @Fluckysan: Je vois le mot thread depuis quelques semaines sans savoir de quoi il retourne (sauf que souvent, c'est accompagné d'une phrase du style "c'est compliqué!" :) ) donc je vais parcourir la doc Android pour voir ce qui se cache derrière ça exactement :D @popolbx: Si je ne parviens pas à comprendre comment utiliser les threads, je me tournerai alors vers la solution "alarme" :D Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
popolbx Posté(e) 17 octobre 2009 Share Posté(e) 17 octobre 2009 pour faire un thread qui touche un composant de l activity tu devras faire un thread dans un thread :D l'alarme c'est plus simple :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alocaly Posté(e) 18 octobre 2009 Share Posté(e) 18 octobre 2009 Whaa, une alarme, c'est un peu prendre un marteau pilon pour ouvrir un noix, non ? Arretez moi si je me trompe : Une alarme, c'est fait pour appeler ton programme à un temps donné, même si ton programme ne tourne plus à ce moment là ( c'est tres bien pour programmer un reveil par exemple ). Pour ton cas, ou tu restes dans le meme programme, il est fortement conseillé d'utiliser quelque chose de plus light, comme les postDelayed. en gros qq chose du genre : Dans ton click image : MyImage.PostDelayed( ChangeImage, 3000 ) ; // 3000 => 3 sec ? Puis plus loin : private Runnable ChangeImage = new Runnable() { public void run() { my_image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.image02)); } }; C'est à la louche, si ca pose des problemes, dis nous lesquels, mais je pense que c'est ca la bonne piste... Emmanuel Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Stilgardt Posté(e) 18 octobre 2009 Auteur Share Posté(e) 18 octobre 2009 @Alocaly/Emmanuel: Merci! Ca marche impec ta solution! :) (juste besoin de la petite retouche suivant: mettre postDelayed au lieu de PostDelayed :D ) Ce n'est pas encore aujourd'hui que je me plongerai dans les threads...ni dans les alarmes :D Merci à vous trois en tout cas! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alocaly Posté(e) 18 octobre 2009 Share Posté(e) 18 octobre 2009 Heureux d'avoir pu t'aider ! A noter : on peut aussi appeler cette fonction sur un objet Handler (plutot que sur une vue ) Et méfie toi : plus ca va, plus tu te rapproches des threads... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
popolbx Posté(e) 18 octobre 2009 Share Posté(e) 18 octobre 2009 ouais parce que bon un appel de runnable. ....t as un pied dans le thread. -- Posté depuis BBFoC Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
hache Posté(e) 18 août 2010 Share Posté(e) 18 août 2010 Bonjour, Je relance le sujet car je me heurte à un problème similaire. Je développe ma première appli qui est un quizz de culture G dans laquelle je m'inspire un peu de l'interface de tout le monde veut prendre sa place. En fait, quand l'utilisateur clique sur une réponse, je veux que le bouton sur lequel il a cliqué se mettre en bleu pendant 300ms par exemple, puis en fonction du cas, si c'est la bonne question, se mette en vert ou si c'est la mauvaise, se mettre en rouge et colore la bonne en vert pendant encore un certain laps de temps. Disons que la bonne reponse est sur le bouton 1 mais que je clique sur le 2 Donc en gros mon code : //code bouton dans onClick si le bouton 2 est cliqué je change le background du bouton en bleu je thread.sleep je change le background du bouton 1 en vert et celui du 2 en rouge je thread.sleep le temps que l'utilisateur puisse voir Mais ca ne fait pas ce que je veux, c'est comme si le dernier sleep ne servait à rien, j'ai a peine le temps de voir le changement de couleur vert/rouge. En fait, je cherche juste a freezer l'interface pour que l'utilisateur ait le temps de voir la réponse. Parce que le "t'as faux mais tu sauras pas pourquoi", c'est mal. J'ai aussi essayé le truc avec le PostDelayed mais sans succes. Merci d'avance. Bien cordialement, Louis Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 18 août 2010 Share Posté(e) 18 août 2010 et après le dernier thread sleep, qu'est tu sensé faire ? Afficher une autre question ? Car on sait pas ce que tu souhaites faire après. Exemple, si c'est une liste de question, rendre les objets non sélectionnables, ou encore si c'est passé à une autre question, le faire lors du retour du thread via handleMessage etc. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
hache Posté(e) 18 août 2010 Share Posté(e) 18 août 2010 Après le freeze qui change la couleur des bons et mauvais boutons, je finis mon activité. En fait, cette activité est appelée via startActForResult. Donc en gros, après le dernier freeze, c'est soit setResult(RESULT_CANCELED) ou setResult(RESULT_OK) puis finish();. De cette façon, je reviens sur ma page où le score est affiché et où je peux cliquer pour commencer une nouvelle question. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 18 août 2010 Share Posté(e) 18 août 2010 OK. Peux-tu nous donner le bout de code où tu gères le dernier thread et son retour ainsi que le retour à l'activité appelante ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
hache Posté(e) 18 août 2010 Share Posté(e) 18 août 2010 Le problème est que je n'utilise pas de thread, j'essaie de m'y pencher mais je galère un peu. En gros voici le code tel qu'il était avant que je farfouille tout pour essayer de faire marcher le bouzin avec un thread qui ne marche pas. Dans onClick : switch (arg0.getId()) { case R.id.b1: // psser le bouton 1 en bleu bRep1.setBackgroundResource(R.drawable.button3); // ici j'aimerais bien freezer l'ui genre 500ms pour qu'on voit que c'est celle la qu'on a cliqué // mais ça au pire c'est pas grave // si bonne rep if(blabal)) { //passer bouton 1 en vert bRep1.setBackgroundResource(R.drawable.button1); setResult(RESULT_OK); } else // mauvaise reponse { // si la bonne reponse était le bouton 2 //y mettre la couleur verte if(blabla)) { bRep2.setBackgroundResource(R.drawable.button1); } // si la bonne reponse était le bouton 2 else if(balba)) { bRep3.setBackgroundResource(R.drawable.button1); } // c'eétait donc le bouton 4 else bRep4.setBackgroundResource(R.drawable.button1); //passer le bouton 1 en rouge bRep1.setBackgroundResource(R.drawable.button2); // Et la aussi, j'aimerais bien un temps de pause histoire que l'utilisateur puisse vior la bonne rep setResult(RESULT_CANCELED); } finish(); break; ... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
hache Posté(e) 18 août 2010 Share Posté(e) 18 août 2010 J'avais mal lu ton post, donc voici l'activité appelante : protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case CODE_ACTIVITE: switch (resultCode) { case RESULT_OK: score++; // + modifier le texte de la TextView et celui du bouton break; case RESULT_CANCELED: // owned, t'es redirigé vers la page ou tu peux submit ton score ... Je veux que le changement de couleurs de boutons se fasse sur l'activité fille, pas dans la mère vu que la mère ne présente pas du tout la même interface. Le code que j'ai donné dans le post précédent correspond à un bout de code de l'activité fifille. Là, je me frotte aux handlers, aux runnable, au postDelayed mais sans vraiment de succès, à mon plus grand désespoir. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
RomainR Posté(e) 17 mai 2011 Share Posté(e) 17 mai 2011 Bonjour à tous, Je rencontre un problème similaire à celui de Stilgardt. Aussi j'ai bien suivi vos réponses et j'ai donc eu recours à la solution du Runnable. Par contre, je voudrais maintenant boucler sur (ou dans) ce Runnable. Je m'explique : je voudrais afficher plusieurs images les unes après les autres avec une petite temporisation (de quelques secondes voir moins) dans l'idée d'un diaporama rapide. L'idée est très proche si ce n'est qu'il me faut maintenant boucler. La différence se trouve aussi dans le fait que je charge des images à partir de la SDcard mais je ne pense pas que ça pose plus de souci que ça pour le bouclage. Mon code est le suivant : public void onClick(View v) { int cpt =0; ImageView im = (ImageView)findViewById(R.id.imageView); im.setImageURI(Uri.parse("/sdcard/images/"+cpt+".jpg")); im.postDelayed(ChangeImage, 10); } private Runnable ChangeImage = new Runnable() { public void run() { ImageView im = (ImageView)findViewById(R.id.imageView); for (cpt=0; cpt<100; cpt++) { im.setImageURI(Uri.parse("/sdcard/images/"+cpt+".jpg")); try { Thread.sleep(100); } catch (InterruptedException e) { e.getMessage(); } } } }; Je ne pense pas être très loin de la solution mais, malheureusement, uniquement la première et la dernière image (0 et 99) s'affiche (même avec un sleep important). Merci d'avance de votre aide ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.