2014-05-02 129 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);     
    }  
} 

,它的工作!