I\'m using two button in view. While clicking two button simultaneously it will goes to different activity at a time. How to avoid this?
I have tried like this, But
Here's a class that debounce's clicks for View and MenuItem.
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.v7.widget.Toolbar.OnMenuItemClickListener;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
/**
* Debounce's click events to prevent multiple rapid clicks.
*
* When a view is clicked, that view and any other views that have applied {@link #shareDebounce} to them,
* will have subsequent clicks ignored for the set {@link #DEBOUNCE_DURATION_MILLIS duration}.
*/
public final class ClickEvent {
private static final long DEBOUNCE_DURATION_MILLIS = 1000L;
private long debounceStartTime = 0;
/**
* Wraps the provided {@link OnClickListener OnClickListener} in a {@link ClickEvent}
* that will prevent multiple rapid clicks from executing.
*
* Usage:
* View.setOnClickListener(ClickEvent.debounce((OnClickListener) v -> // click listener runnable))
*/
public static OnClickListener debounce(@NonNull OnClickListener onClickListener) {
return new ClickEvent().wrapOnClickListener(onClickListener);
}
/**
* Wraps the provided {@link OnMenuItemClickListener OnMenuItemClickListener} in a
* that will prevent multiple rapid clicks from executing.
*
* Usage:
* MenuItem.setOnClickListener(ClickEvent.debounce((OnMenuItemClickListener) v -> // click listener runnable))
*/
public static OnMenuItemClickListener debounce(@NonNull OnMenuItemClickListener onClickListener) {
return new ClickEvent().wrapOnClickListener(onClickListener);
}
/**
* Allows the debounce to be shared between views to prevent multiple rapid clicks between views.
*
* Usage:
*
* ClickEvent clickEvent = new ClickEvent();
* View1.setOnClickListener(clickEvent.shareDebounce((OnClickListener) v -> // click listener runnable for View1))
* View2.setOnClickListener(clickEvent.shareDebounce((OnClickListener) v -> // click listener runnable for View2))
*
*/
public OnClickListener shareDebounce(@NonNull OnClickListener listener) {
return wrapOnClickListener(listener);
}
/**
* Allows the debounce to be shared between views to prevent multiple rapid clicks between views.
* Usage:
*
* ClickEvent clickEvent = new ClickEvent();
* MenuItem1.setOnClickListener(clickEvent.shareDebounce((OnMenuItemClickListener) v -> // click listener runnable for MenuItem1))
* MenuItem2.setOnClickListener(clickEvent.shareDebounce((OnMenuItemClickListener) v -> // click listener runnable for MenuItem2))
*
*/
public OnMenuItemClickListener shareDebounce(@NonNull OnMenuItemClickListener listener) {
return wrapOnClickListener(listener);
}
public void setDebounceStartTime() {
debounceStartTime = SystemClock.elapsedRealtime();
}
public boolean isThrottled() {
return SystemClock.elapsedRealtime() - debounceStartTime < DEBOUNCE_DURATION_MILLIS;
}
private OnClickListener wrapOnClickListener(@NonNull OnClickListener onClickListener) {
if (onClickListener instanceof OnThrottledClickListener) {
throw new IllegalArgumentException("Can't wrap OnThrottledClickListener!");
}
return new OnThrottledClickListener(this, onClickListener);
}
private OnMenuItemClickListener wrapOnClickListener(@NonNull OnMenuItemClickListener onClickListener) {
if (onClickListener instanceof OnThrottledClickListener) {
throw new IllegalArgumentException("Can't wrap OnThrottledClickListener!");
}
return new OnThrottledClickListener(this, onClickListener);
}
private static class OnThrottledClickListener implements OnClickListener, OnMenuItemClickListener {
private final ClickEvent clickEvent;
private OnClickListener wrappedListener;
private OnMenuItemClickListener wrappedMenuItemClickLister;
OnThrottledClickListener(@NonNull ClickEvent clickEvent, @NonNull OnClickListener onClickListener) {
this.clickEvent = clickEvent;
this.wrappedListener = onClickListener;
}
OnThrottledClickListener(@NonNull ClickEvent clickEvent, @NonNull OnMenuItemClickListener onClickListener) {
this.clickEvent = clickEvent;
this.wrappedMenuItemClickLister = onClickListener;
}
@Override
public void onClick(View v) {
if (clickEvent.isThrottled()) {
return;
}
wrappedListener.onClick(v);
clickEvent.setDebounceStartTime();
}
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
if (clickEvent.isThrottled()) {
return false;
}
clickEvent.setDebounceStartTime();
return wrappedMenuItemClickLister.onMenuItemClick(menuItem);
}
}
}