2010-12-04 3 views
6

Ce que je veux que je veux atteindre:Android Handler périodiquement

  1. Une activité commence sans clickListener et a quatre textviews tous avec fond blanc

  2. Je veux changer la couleur de textview 1 à bleu. Attendez 2 secondes puis remettez-le en blanc et changez la vue de texte 2 en bleu. attendez 2 secondes, puis remettez-le en blanc ... jusqu'à ce que j'ai changé la vue en texte 4 en bleu et en blanc.

  3. Une fois cela terminé, je veux ajouter le ClickListener et attendre la saisie de l'utilisateur.

Comment puis-je y parvenir? Je suis nouveau sur Android, mais comprend des morceaux.

Répondre

1

Il n'est pas nécessaire de créer un fil pour cela, ou des animations.

La solution est très simple: utiliser Handler.postDelayed() ou Handler.sendMessageDelayed():

http://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable, long) http://developer.android.com/reference/android/os/Handler.html#sendMessageDelayed(android.os.Message, long)

Pour une mise en œuvre robuste, assurez-vous d'enlever tout messages en attente au moins par Activity.onDestroy(). (Ou si vous les publiez dans Activity.onStart(), supprimez-les dans Activity.onStop(); si vous publiez dans Activity.onResume(), supprimez dans Activity.onPause().)

+0

Oui, Hackbod, j'aime votre méthode comme concise et l'activité a un fil que je peux utiliser. J'utilise la méthode Handler.postDelayed et fonctionne la première fois. Je dois comprendre comment envoyer des messages et recevoir des messages pour rappeler ce fil? Comme vous pouvez le voir, je suis assez nouveau! – SingleMalt

2

Vous pouvez y parvenir en créant des séquences Animation, en code XML ou Java, et en les déclenchant en séquence. Vous aurez besoin de définir une séquence d'animation avec LayoutAnimationController, à la fin de l'animation, vous pouvez ajouter le ClickListener. Le développeur Life a un good tutorial to get you started on animations. Jeff a une série de tutoriels en deux parties sur les animations - part 1, part 2.

Hope this helps, indyfromoz

+0

La raison pour laquelle je ne peux pas créer un l'animation est parce que ma grille est dynamique. Parfois, il peut avoir 4 TextViews et d'autres fois 6 et parfois, 9 et ainsi de suite. – SingleMalt

+0

Dans ce cas, il est préférable de concevoir la séquence d'animation dans le code et de la démarrer lorsque la grille contient toutes les vues. – indyfromoz

0

J'ai un échantillon pour cette tâche, mais par fil avec handleMessage

import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.EditText; 
import android.widget.TextView; 

public class l15_threadOneaacto extends Activity { 
    /** Called when the activity is first created. */ 
    TextView tv[]=new TextView[4]; 
    EditText et; 
    Thread bcko; 
    static int index=0; 

    boolean isRunning=false; 
    boolean acceptevent=false; 
    Handler hn=new Handler(){ 
     @Override 
     public void handleMessage(android.os.Message msg) { 
      switch (index) { 
      case 0: tv[0].setBackgroundColor(Color.BLUE); break; 
      case 1: tv[0].setBackgroundColor(Color.WHITE); break; 
      case 2: tv[1].setBackgroundColor(Color.BLUE); break; 
      case 3: tv[1].setBackgroundColor(Color.WHITE); break; 
      case 4: tv[2].setBackgroundColor(Color.BLUE); break; 
      case 5: tv[2].setBackgroundColor(Color.WHITE); break; 
      case 6: tv[3].setBackgroundColor(Color.BLUE); break; 
      case 7: tv[3].setBackgroundColor(Color.WHITE); break; 
      } 
      index++; 
      if(index==8){ 
       acceptevent=true; 
       et=(EditText)findViewById(R.id.bbb); 
       et.setText("ready for input"); 
      } 

     }; 

    }; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     tv[0]=(TextView)findViewById(R.id.tx1); 
     tv[1]=(TextView)findViewById(R.id.tx2); 
     tv[2]=(TextView)findViewById(R.id.tx3); 
     tv[3]=(TextView)findViewById(R.id.tx4); 





    } 




    @Override 
    protected void onStart() { 
     // TODO Auto-generated method stub 
     super.onStart(); 

     bcko=new Thread (new Runnable() { 

      @Override 
      public void run() { 
       try { 

         // 
         for(int i=0;i<8 && isRunning;i++){ 
          Thread.sleep(2000); 
         hn.sendMessage(hn.obtainMessage()); 
         } 

       } catch (Exception e) { 
        // TODO: handle exception 
       } 

      } 
     }); 
     isRunning=true; 
     bcko.start(); 



    } 
    @Override 
    protected void onStop() { 
     // TODO Auto-generated method stub 
     super.onStop(); 
     isRunning=false; 
    } 
} 

kayout:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:id="@+id/tx1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#FFFFFFFF" 
    android:text="" 
    /> 
    <TextView 
    android:id="@+id/tx2" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#FFFFFFFF" 
    android:text="" 
    /> 
    <TextView 
    android:id="@+id/tx3" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#FFFFFFFF" 
    android:text="" 
    /> 
    <TextView 
    android:id="@+id/tx4" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#FFFFFFFF" 
    android:text="" 
    /> 
    <EditText 
    android:id="@+id/bbb" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="not ready " 
    /> 
</LinearLayout> 

Bonne chance,

+1

Créer un fil de discussion est probablement le chemin à suivre par rapport à l'animation sur ce sujet. De plus, vous aurez besoin de créer une méthode qui créera éventuellement vos onClickListeners. Votre thread aura besoin d'un handle pour cette méthode. – user432209

+0

Merci Mohammed et user432209. Cependant, les réponses hackbod semblent meilleures. – SingleMalt