如何在 Android 中为一组按钮执行一个又一个可运行的?
How to execute a runnable after another in Android for a set of buttons?
我是 Android 的新手。我的目标是让这 4 个按钮中的每一个按钮都依次闪烁红色(并返回默认值)。
按钮 0 闪烁一秒钟,然后切换回默认颜色。
按钮 1 闪烁一秒钟,然后切换回默认颜色。
等等...直到完整序列完成。
出于这个原因,我为处理程序创建了一个循环,并为每个按钮创建了 4 个不同的可运行对象(无法想出一种机制来解决仅对所有按钮使用一个可运行对象的问题)我的代码做了一些与我不同的事情 expecting.It红色按钮 0 亮起 2 秒(大约),按钮 2 亮起一秒钟,按钮 1 和按钮 3 根本没有闪烁,但它们都进入循环,因为它们都变成 btn_default_small 样式。
btn_default_small 也不是默认按钮的样子。
public class MainActivity extends ActionBarActivity {
Button button0;
Button button1;
Button button2;
Button button3;
private Handler handler;
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button0 = (Button) findViewById(R.id.button0);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
handler = new Handler();
for(int x=0;x<=3;x++){
switch(x){
case 0:
handler.postDelayed(runnableButton0, 500);
break;
case 1:
handler.postDelayed(runnableButton1, 500);
break;
case 2:
handler.postDelayed(runnableButton2, 500);
break;
case 3:
handler.postDelayed(runnableButton3, 500);
break;
}
};
}
private void LightButton(Button b, Runnable r) {
if(count==0){
b.getBackground().setColorFilter(new LightingColorFilter(0xff0000, 0xff0000));//Change button color to red
count++;
handler.postDelayed(r, 700);
}
else{
b.setBackgroundResource(android.R.drawable.btn_default_small);//Change button color to default
count=0;
}
}
Runnable runnableButton0= new Runnable() {
@Override
public void run() {
LightButton(button0, runnableButton0);
}
};
Runnable runnableButton1= new Runnable() {
@Override
public void run() {
LightButton(button1, runnableButton1);
}
};
Runnable runnableButton2= new Runnable() {
@Override
public void run() {
LightButton(button2, runnableButton2);
}
};
Runnable runnableButton3= new Runnable() {
@Override
public void run() {
LightButton(button3, runnableButton3);
}
};
我做错了什么或者我对处理程序和可运行操作循环有什么不了解?
What am I doing wrong or what am I not understanding about handler and
runnable action cycle?
首先,你 post 同时所有这些可运行对象,你还在它们之间共享计数变量(你不应该这样),这将使它们中的一些不改变背景。
private Buttons[] btns = /* an array holding all your 4 buttons*/
private int count = 0;
Runnable runMe = new Runnable() {
@Override
public void run() {
if (count == btns.length) {
// we iterated over the entire btns array so abort
btns[count - 1].getBackground.clearColorFilter();
return;
}
if (count >= 1) {
// change the previous button back to normal only if
// we are at the second button
btns[count - 1].getBackground.clearColorFilter();
}
// change the background
btns[count].getBackground().setColorFilter(new LightingColorFilter(0xff0000, 0xff0000));
// increase count to iterate over the btns array
count++;
// schedule the next step
handler.postDelayed(this, 1000);
}
};
// in onCreate(),start the flashing with a 1 second delay
handler.postDelayed(runMe, 1000);
上面的代码应该在初始延迟 1 秒后,将第一个按钮的背景更改为颜色(颜色),然后在 1 秒后将第一个按钮的背景更改为正常,将第二个按钮的背景更改为正常到颜色(等等)。
我是 Android 的新手。我的目标是让这 4 个按钮中的每一个按钮都依次闪烁红色(并返回默认值)。 按钮 0 闪烁一秒钟,然后切换回默认颜色。 按钮 1 闪烁一秒钟,然后切换回默认颜色。 等等...直到完整序列完成。 出于这个原因,我为处理程序创建了一个循环,并为每个按钮创建了 4 个不同的可运行对象(无法想出一种机制来解决仅对所有按钮使用一个可运行对象的问题)我的代码做了一些与我不同的事情 expecting.It红色按钮 0 亮起 2 秒(大约),按钮 2 亮起一秒钟,按钮 1 和按钮 3 根本没有闪烁,但它们都进入循环,因为它们都变成 btn_default_small 样式。 btn_default_small 也不是默认按钮的样子。
public class MainActivity extends ActionBarActivity {
Button button0;
Button button1;
Button button2;
Button button3;
private Handler handler;
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button0 = (Button) findViewById(R.id.button0);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
handler = new Handler();
for(int x=0;x<=3;x++){
switch(x){
case 0:
handler.postDelayed(runnableButton0, 500);
break;
case 1:
handler.postDelayed(runnableButton1, 500);
break;
case 2:
handler.postDelayed(runnableButton2, 500);
break;
case 3:
handler.postDelayed(runnableButton3, 500);
break;
}
};
}
private void LightButton(Button b, Runnable r) {
if(count==0){
b.getBackground().setColorFilter(new LightingColorFilter(0xff0000, 0xff0000));//Change button color to red
count++;
handler.postDelayed(r, 700);
}
else{
b.setBackgroundResource(android.R.drawable.btn_default_small);//Change button color to default
count=0;
}
}
Runnable runnableButton0= new Runnable() {
@Override
public void run() {
LightButton(button0, runnableButton0);
}
};
Runnable runnableButton1= new Runnable() {
@Override
public void run() {
LightButton(button1, runnableButton1);
}
};
Runnable runnableButton2= new Runnable() {
@Override
public void run() {
LightButton(button2, runnableButton2);
}
};
Runnable runnableButton3= new Runnable() {
@Override
public void run() {
LightButton(button3, runnableButton3);
}
};
我做错了什么或者我对处理程序和可运行操作循环有什么不了解?
What am I doing wrong or what am I not understanding about handler and runnable action cycle?
首先,你 post 同时所有这些可运行对象,你还在它们之间共享计数变量(你不应该这样),这将使它们中的一些不改变背景。
private Buttons[] btns = /* an array holding all your 4 buttons*/
private int count = 0;
Runnable runMe = new Runnable() {
@Override
public void run() {
if (count == btns.length) {
// we iterated over the entire btns array so abort
btns[count - 1].getBackground.clearColorFilter();
return;
}
if (count >= 1) {
// change the previous button back to normal only if
// we are at the second button
btns[count - 1].getBackground.clearColorFilter();
}
// change the background
btns[count].getBackground().setColorFilter(new LightingColorFilter(0xff0000, 0xff0000));
// increase count to iterate over the btns array
count++;
// schedule the next step
handler.postDelayed(this, 1000);
}
};
// in onCreate(),start the flashing with a 1 second delay
handler.postDelayed(runMe, 1000);
上面的代码应该在初始延迟 1 秒后,将第一个按钮的背景更改为颜色(颜色),然后在 1 秒后将第一个按钮的背景更改为正常,将第二个按钮的背景更改为正常到颜色(等等)。