我们在开发的时候经常遇到这样一个问题,就是点击一个view点的过快导致点击事件执行了很多次,非常影响体验,其实解决办法也非常简单,原理就是点击view的时候先设置view的clickable=false,点击之后设置500ms后才可以点击,看一下代码实现
Java:
public static void fastClickChecked(final View v, final View.OnClickListener listener){
if(v==null)return;
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v1) {
listener.onClick(v1);
v1.setClickable(false);
v.postDelayed(new Runnable() {
@Override
public void run() {
v.setClickable(true);
}
},500);
}
});
}
kotlin:
public static void fastClickChecked(View v, View.OnClickListener listener){
if(v==null)return;
v.setOnClickListener(v1 -> {
listener.onClick(v1);
v1.setClickable(false);
v.postDelayed(() -> {
v.setClickable(true);
}, 500);
});
}
原理都一样
调用方法:
mBtnLiandian1=findViewById(R.id.btn_liandian1);
fastClickChecked(mBtnLiandian1, new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ClickActivity.this,"防止连点1",Toast.LENGTH_SHORT).show();
Log.e("ClickActivity","防止连点1");
}
});
上面都可以写到工具类里面,调用方便实现简单
还有一种别人写的是用计算点击的时间来防止连点,在某一时间点击之后,从这个时间计算多长时间之内不能点击-传送门
public abstract class NoDoubleListener implements View.OnClickListener {
public static final int MIN_CLICK_DELAY_TIME = 3000;
private static final String TAG ="NoDoubleListener" ;
private long lastClickTime = 0;
@Override
public void onClick(View v) {
long currentTime = Calendar.getInstance().getTimeInMillis();
if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {
lastClickTime = currentTime;
onNoDoubleClick(v);
}else {
Log.w(TAG,"点击过快");
}
}
protected abstract void onNoDoubleClick(View v);
}
实现方法:
TextView tv = (TextView) findViewById(R.id.tv_btn);
tv.setOnClickListener(new NoDoubleListener() {
@Override
protected void onNoDoubleClick(View v) {
Toast.makeText(DemoActivity.this,"点击了按钮", Toast.LENGTH_SHORT).show();
}
});