Robin71
Robin71

Reputation: 403

Android - change UI immediately

After click button I would like to change its color, then wait one second and change its color back.

This is my code:

public void click(final View view) throws InterruptedException {

    final Button btn = findViewById(view.getId());

    btn.setBackgroundColor(Color.parseColor("#0000ff"));
    btn.setClickable(false);

    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });

    t.start();
    t.join();

    btn.setBackgroundColor(Color.parseColor("#e2e2e2"));
    btn.setClickable(true);
}

It doesn't work. I've checked it with more complex code and debugger and it looks like all UI changes are made collectively after finish this function.

I've found this thread: apply ui changes immediately and tried to put setBackgroundColor() and setClickable() into runOnUiThread function:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        btn.setBackgroundColor(Color.parseColor("#0000ff"));
        btn.setClickable(false);
    }
});

But it also doesn't work. What should I do?

Upvotes: 0

Views: 142

Answers (5)

Mark
Mark

Reputation: 9919

Something like this :

private final Handler handler = new Handler();

public void click(final View view) {
      view.setBackgroundColor(Color.parseColor("#0000ff"));
      view.setClickable(false);
      handler.postDelayed(() -> {
            view.setBackgroundColor(Color.parseColor("#e2e2e2"));
            view.setClickable(true);
      }, 1000);
}

@Override protected void onPause() {
      super.onPause();

      handler.removeCallbacks(null);
}

Upvotes: 2

Reaz Murshed
Reaz Murshed

Reputation: 24211

The question is not very clear. However, I am trying to summarize the question that I have understood from your question.

You are trying to set a button's background color on clicking on it and change it back after some time. If this is the situation, then I think your idea of how threads work is wanting.

In your code, the button will change the color immediately as the sleep that you are using is running in another thread (other than UI thread). The code is executed correctly, however, you cannot see the effect of the Thread.sleep as its running in a separate thread.

So all you need to do here is to change the background color again inside the thread. Modify your code like the following.

public void click(final View view) throws InterruptedException {

    final Button btn = findViewById(view.getId());

    btn.setBackgroundColor(Color.parseColor("#0000ff"));
    btn.setClickable(false);

    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
                btn.setBackgroundColor(Color.parseColor("#e2e2e2"));
                btn.setClickable(true);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });

    t.start();
}

This should work.

I have created a demo trying to show what the code will do.

enter image description here

However, using Handler in case of updating UI elements in this specific case is recommended. Please see the comments below.

public void click(final View view) throws InterruptedException {

    final Button btn = findViewById(view.getId());

    btn.setBackgroundColor(Color.parseColor("#0000ff"));
    btn.setClickable(false);

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {
        @Override 
        public void run() { 
            btn.setBackgroundColor(Color.parseColor("#e2e2e2"));
            btn.setClickable(true);
        } 
    }, 1000); 
}

Upvotes: 1

Atik Faysal
Atik Faysal

Reputation: 158

Try this,i think it's work for you..

final Button bPdf = findViewById(R.id.pdf);
                bPdf.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                                bPdf.setBackgroundColor(Color.parseColor("#0000ff"));
                                new CountDownTimer(1000, 50) {
                                        @Override
                                        public void onTick(long arg0) {
                                                // TODO Auto-generated method stub
                                        }
                                        @Override
                                        public void onFinish() {
                                                bPdf.setBackgroundColor(Color.parseColor("#e2e2e2"));
                                        }
                                }.start();
                        }
                });

Upvotes: 0

Sahil
Sahil

Reputation: 972

Hope the following code will help :

btn.setBackgroundColor(Color.RED); // color you want for a second
new CountDownTimer(1000, 1000) {

    @Override
    public void onTick(long arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onFinish() {
                    btn.setBackgroundColor(Color.BLUE); //to change back color to prior state
                }
}.start();

Upvotes: 0

Ryan McCaffrey
Ryan McCaffrey

Reputation: 211

Not sure why that wouldn't work, but I've done something similar with

delayHandler = new Handler();
delayHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                           //change stuff on ui 
                        }
                    });
                }
            }, 1000);

if that doesn't work the only other functional difference in my code is that instead of btn being a final Button it's a private global variable in my activity.

Upvotes: 0

Related Questions