2016-11-14 46 views
1

我建立我的第一个Android应用程序,我试图做一个记忆游戏。无论如何,我需要使按钮数组改变颜色1秒钟,然后按顺序返回到其原始颜色,例如:button1变为黄色,持续1秒钟后返回灰色,然后button2变为黄色1秒然后返回,依此类推。我试着用处理器,但它始终只有最后一次迭代后的作品,这是我的代码:如何使用Android处理程序在一个循环

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);} 

我究竟做错了什么?

编辑 找到如何做到这一点。首先我需要一个可运行的类,它PARAMATERS前MyRunnable实现Runnable(使用Runnable接口),然后写一个使用该paramater的方法,我不能与正规之一,因为它依赖于我这样做,我和改变迭代。

+0

因为十次迭代完成快超过1秒 – Pein

回答

0

您需要在每个循环内部创建一个新的Runnable,因为所有9个延迟的帖子运行的是您在第9次循环和最终循环中创建的相同的可运行循环,因为循环无疑需要不到一秒的时间才能完成。因此,尝试这样的事情:

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

你同步(同时)所有按钮的颜色设置为黄色,同时也创造9个异步任务(每个按钮)来改变颜色后,一个为灰色第二。这意味着所有按钮将在大约1秒后(或多或少)同时变回灰色。

认为处理程序,您添加任务队列。呼叫postDelayed()是调度任务以在将来执行,但所有的人都在同一时间安排,所以他们都将在未来的同时被执行。

我还没有运行它,但我认为这种做法更多的是你在找什么:

// 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); 

请注意,我使用sendEmptyMessage*()代替post*(),但是也可以使用两种方法。此外,处理程序的消息(任务)可以具有输入参数,因此使用它们会很好。

+0

感谢您的回复,还是它的发言权很遗憾。 –