如何在 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 秒后将第一个按钮的背景更改为正常,将第二个按钮的背景更改为正常到颜色(等等)。