1

我有一个GridLayout里面有几个按钮。

我需要按顺序更改每个按钮的颜色,比如说,每 3 秒一次。

我在这里遇到问题......看看我的代码:

runnableScan = new Runnable() {
    @Override
    public void run() {
        GridLayout view = Grid;
        for ( int i = 0; i < view.getChildCount(); i++) {
            Button btn = (Button)view.getChildAt(i);
            btn.setBackgroundColor(Color.RED);
            handlerScan.postDelayed(this, 3000);                                        
        }
    }
};      
handlerScan.postDelayed(runnableScan, 3000);      

好吧..它确实将所有按钮的颜色更改为红色,但它会立即将它们全部更改!

我希望它按顺序更改颜色,每 3 秒一个按钮。

如果我在Toast里面放一个,Toast它将每三秒触发一次,每个按钮的索引。

我做错了什么?为什么所有按钮一次都变成红色?

4

1 回答 1

0

runnable 的run()方法仍在循环所有按钮,并在一次调用期间更改所有按钮的颜色run()

这一行:

  handlerScan.postDelayed(this, 3000);                                        

不会在循环的迭代之间添加延迟for。它只安排run()在 3 秒后再次被调用。试试这个(没有 for 循环)。

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

        GridLayout view = Grid;
        Button btn = (Button)view.getChildAt(buttonIndex++);
        if (btn != null) {
           btn.setBackgroundColor(Color.RED);
           handlerScan.postDelayed(this, 3000);
        }
     }
  };
  handlerScan.postDelayed(runnableScan, 3000);

buttonIndex您需要在类中将其作为成员变量进行跟踪:

private int buttonIndex;

然后将其初始化为第一个按钮的索引。例如,如果您将内容视图设置为onCreate(),则使用:

   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.some_layout_name);

      GridLayout view = Grid;
      for (buttonIndex = 0; buttonIndex < view.getChildCount(); buttonIndex++) {
         View v = view.getChildAt(buttonIndex);
         if (v instanceof Button) {
            // we found the first button, so stop looping
            break;
         }
      }

      handlerScan = new Handler();

我向您展示的代码的工作方式是将按钮 1 的颜色更改为红色,然后 3 秒后,将按钮 2 更改为红色,然后 3 秒后,将按钮 3 更改为红色。如果您想重新开始该过程,只需buttonIndex在完成更改按钮 3 后重置回第一个按钮的索引即可。

于 2013-05-27T03:38:42.047 回答