我有一个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
将每三秒钟使用每个按钮的索引触发。
我做错了什么?为什么所有按钮都会立刻变为红色?
答案 0 :(得分:0)
可运行的run()
方法仍在所有按钮上循环,并在一次调用{{}期间更改所有的颜色1}}。
这一行:
run()
不会在 handlerScan.postDelayed(this, 3000);
循环的迭代之间添加延迟。它只计划在3秒后再次调用for
。试试这个(使用 no for loop )。
run()
您需要在班级中跟踪 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()
我向您展示的代码的工作方式是将按钮1的颜色更改为红色,然后3秒后将按钮2更改为红色,然后3秒后将按钮3更改为红色。如果您想再次启动该过程,只需在完成更改按钮3后,将 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();
重置回第一个按钮的索引。