android - Avoid button multiple rapid clicks -
i have problem app if user clicks button multiple times quickly, multiple events generated before dialog holding button disappears
i know solution setting boolean variable flag when button clicked future clicks can prevented until dialog closed. have many buttons , having everytime every buttons seems overkill. there no other way in android (or maybe smarter solution) allow only event action generated per button click?
what's worse multiple quick clicks seems generate multiple event action before first action handled if want disable button in first click handling method, there existing events actions in queue waiting handled!
please thanks
here's 'debounced' onclick listener wrote recently. tell minimum acceptable number of milliseconds between clicks is. implement logic in ondebouncedclick instead of onclick
import android.os.systemclock; import android.view.view; import java.util.map; import java.util.weakhashmap; /** * debounced onclicklistener * rejects clicks close in time. * class safe use onclicklistener multiple views, , debounce each 1 separately. */ public abstract class debouncedonclicklistener implements view.onclicklistener { private final long minimuminterval; private map<view, long> lastclickmap; /** * implement in subclass instead of onclick * @param v view clicked */ public abstract void ondebouncedclick(view v); /** * 1 , constructor * @param minimumintervalmsec minimum allowed time between clicks - click sooner after previous click rejected */ public debouncedonclicklistener(long minimumintervalmsec) { this.minimuminterval = minimumintervalmsec; this.lastclickmap = new weakhashmap<view, long>(); } @override public void onclick(view clickedview) { long previousclicktimestamp = lastclickmap.get(clickedview); long currenttimestamp = systemclock.uptimemillis(); lastclickmap.put(clickedview, currenttimestamp); if(previousclicktimestamp == null || (currenttimestamp - previousclicktimestamp.longvalue() > minimuminterval)) { ondebouncedclick(clickedview); } } }
Comments
Post a Comment