2016-11-14 4 views
1

私は最初のアンドロイドアプリケーションを構築しています。私はメモリゲームを作ろうとしています。とにかく、ボタンの配列を1秒間色を変えてから元の色に順番に戻す必要があります。たとえば、button1が黄色に変わり、1秒間そのままの状態で灰色に戻り、button2が黄色に変わります1秒後に戻ります。これは私のコードですが、私はハンドラを使用してみましたが、それは常に唯一の最後の繰り返しの後に動作します:ループでアンドロイドハンドラを使う方法

for (i = 0; i < 9; i++) { 

        buttonList.get(i).setBackgroundColor(Color.YELLOW); 


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

          buttonList.get(i).setBackgroundColor(Color.GRAY); 

         } 
        }; 
        handler.postDelayed(runnable,1000);} 

私が間違って何をやっていますか?

編集 が見つかりました。最初に、私は、私と私は変更に依存するので、私は通常のものとそれを行うことはできませんMyRunnableは(Runnableインターフェイスを使用して)Runnableを実装するparamatersを取るrunnableクラスを作る必要があります繰り返し。

+0

10回の反復が1秒より速く終了したので、 – Pein

答えて

0

9つの遅れた投稿のすべてが、9番目と最後のループで作成した同じ実行可能ファイルを実行しているため、ループ内に新しいRunnableを作成する必要があります。したがって、このような何かを試してみてください。

for (i = 0; i < 9; i++) { 
    buttonList.get(i).setBackgroundColor(Color.YELLOW); 
    Runnable runnable = new Runnable(){ 
     @Override 
     public void run() { 
      buttonList.get(i).setBackgroundColor(Color.GRAY); 
     }}; 
    handler.postDelayed(runnable,1000); 
} 
+0

あなたの返信をありがとうが、それでも同じです。私は私が私を使用することはできませんし、実行可能にその値を渡すために何らかの方法を使用する必要があると思うが、私はどのようにわからない –

0

あなたは黄色に、すべてのボタンの色を設定し、また、1の後にグレーに色を変更するには9つの非同期タスク(各ボタンに1つ)を作成する(同時に)同期しています秒。これは、すべてのボタンが約1秒後に(多かれ少なかれ)同時に色を灰色に変えることを意味します。

ハンドラをタスクを追加するキューと考えてください。 postDelayed()というコールは、あなたのタスクが将来実行されるようにスケジューリングしていますが、それらはすべて同時にスケジュールされているので、それらはすべて将来同時に実行されます。

私はそれを実行していないが、私は、このアプローチは、あなたが探しているものをよりだと思う:私はsendEmptyMessage*()代わりのpost*()を使用していますが、どちらの方法を使用することができる

// Those are fields 
private int buttonIndex = 0; 
private boolean yellow = false; 
private final Handler handler = new Handler(new Handler.Callback() { 
    @Override 
    public void handleMessage(Message msg) { 
     if (!yellow) { 
      buttonList.get(buttonIndex).setBackgroundColor(Color.YELLOW); 
      handler.sendEmptyMessageDelayed(0, 1000); 
     } else { 
      buttonList.get(buttonIndex).setBackgroundColor(Color.GRAY); 
      if (++buttonIndex < 9) handler.sendEmptyMessage(0); 
     } 
     yellow = !yellow; 
}}); 

// Call this to start the sequence. 
handler.sendEmptyMessage(0); 

注意。さらに、ハンドラのメッセージ(タスク)は入力パラメータを持つことができるので、それらを使用するのがよいでしょう。

+0

あなたの返信をありがとう、まだそれは残念なことに言う。 –

関連する問題