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

感謝您的回覆,還是它的發言權很遺憾。 –