Ari
Ari

Reputation: 3127

Delayed action after last button click

I want my ImageButton image to be changed after some time after last click.

ImageButton b = ...
b.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {
    b.removeCallbacks(null);
    b.postDelayed(new Runnable() {
      @Override
      public void run() {
        b.setImageResource(android.R.drawable.ic_delete);
      }
    }, 1500);
  }
});

This code doesn't work. Line removing callbacks returns true, but doesn't remove any callbacks. If I'm clicking button again and again it will change image after 1,5s after first click.

Upvotes: 0

Views: 876

Answers (3)

stan0
stan0

Reputation: 11817

The removeCallbacks method removes(cancels the execution of) a previously posted runnable. You have to put the same (Runnable) object as an argument of removeCallbacks if you wish to stop its execution:

_myRunnable = new Runnable() {...};
...
b.removeCallbacks(_myRunnable);
b.postDelayed(myRunnable, 1500);

Upvotes: 0

Sam
Sam

Reputation: 1662

To make it clearer:

define handler and runnable as private fields. That will make them reusable on all button clicks

private Handler mHandler = new Handler();
private Runnable mClickRunnable = new Runnable() {
      @Override
      public void run() {
        mInmageView.setImageResource(android.R.drawable.ic_delete);
      }
    };

in onClick()

mHandler.removeCallbacks(mClickRunnable);
mHandler.postDelayed(mClickRunnable, 1500);

First line removes previous callbacks(we don't need them anymore)

Second line begins new callback

Upvotes: 0

Roger Alien
Roger Alien

Reputation: 3080

Try this one?

 public void onClick(View v) {
    b.removeCallbacks(clickRunnable);
    b.postDelayed(clickRunnable, 1500);
  }


  Runnable clickRunnable = new Runnable() {
      @Override
      public void run() {
        b.setImageResource(android.R.drawable.ic_delete);
      }
    };

Upvotes: 1

Related Questions