2014-05-02 236 views
-1

今天我開始寫一個簡單的android應用程序。這個想法是,按下按鈕時,調用方法「click(View v)」女巫,將TextField的背景改爲1秒後的隨機顏色,比如說30次暫停線程週期(android)

(長篇小說:30種不同的背景顏色以1秒爲間隔變化)。

這裏是我有:

public void click(View v) { 

    for(int i = 0; i >= 30; i++){  
     Random rand = new Random(); 
     final int red = rand.nextInt(255); 
     final int green = rand.nextInt(255); 
     final int blue = rand.nextInt(255); 
     final TextView tf = (TextView) findViewById(R.id.textView1); 

     // SLEEP 1 SECOND HERE ... 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
      tf.setBackgroundColor(Color.rgb(red, green, blue)); 
      } 
     }, 1000); 
    } 
} 

但是,當我按下按鈕沒有任何反應。作爲初學者,我會非常感謝任何建議如何解決這個問題。

回答

0

嘗試調用tf.invalidate()強制重繪。

此外,如果您希望它每秒更新30秒,則應將1000更改爲i * 1000(而不是像評論所暗示的那樣睡覺)。正如當前所寫的所有postdelayed結尾幾乎在同一時間。

你也可以在循環之外移動處理程序的創建,不需要創建倍數。

+1

感謝您的改進,但不幸tf.invalidate()不適用於我。但是,當我刪除for循環它正常工作(在按鈕按下1秒後,背景顏色變化,一次。) – user3578760

0

3個小時後,我終於解決了這個問題。 for循環頭文件中有一個錯誤。 恰好在i> = 30。像這樣寫,循環中的代碼永遠不會啓動。它必須是i < = 30。多麼愚蠢的錯誤-_-

因此,代碼看起來像現在這樣:

public void click(View v) { 
    Handler handler = new Handler(); 
    final Random rand = new Random(); 
    for(int i=1; i <= 30; i++){   
     handler.postDelayed(new Runnable() { 
      public void run() { 
       int red = rand.nextInt(255); 
       int green = rand.nextInt(255); 
       int blue = rand.nextInt(255); 
       TextView tf = (TextView) findViewById(R.id.textView1); 
       tf.setBackgroundColor(Color.rgb(red, green, blue));     
      } 
     }, i * 1000);     
    }  
} 

,它的工作!