相信大家在项目开发中都遇到过这种case,点击按钮时,由于手机一时卡顿或者手速过快,造成按钮重复多次点击,跳转生成多个Activity(然后一个个关)或者其他重复操作。
现在,就让我们通过几行代码一劳永逸的解决它。
小工具的核心思想就是借助System.currentTimeMillis()计算多次点击按钮的时间差,如果这个时间差很小,我们就认为这是无效的重复点击。
封装一个Utils工具类(以后还会有更多更好的工具哦),isFastClick方法寥寥数行核心代码:
public class Utils {
private static long lastClickTime;
public static boolean isFastClick() {
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if (0 < timeD && timeD < 800) {
return true;
}
lastClickTime = time;
return false;
}
}
开发好小工具,下面让他大显身手。
主要就是两种场景,
第一种,从架构级别的整体角度,我让所有Activity的父类BaseActivity实现OnClickListener接口,重写onClick方法,在方法中使用isFastClick():
public abstract class BaseActivity extends Activity implements View.OnClickListener{
···
@Override
public void onClick(View v) {
if (Utils.isFastClick()) {
return;
}
}
这样,子类就不必实现OnClickListener接口,只需要重写父类的onClick方法,在方法中调用父类的onClick即可。
public class MainActivity extends BaseActivity {
···
@Override
public void onClick(View v) {
super.onClick(v);
switch (v.getId()) {
case R.id.mvp_btn_main:
gotoNextActivity(LoginActivity.class);
break;
···
第二种场景,缩小到到局部匿名内部类的onClick方法中,这时直接调用Utils的isFastClick方法即可。
mFabBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Utils.isFastClick();
Snackbar.make(v,"权兴权意,品质为真",Snackbar.LENGTH_SHORT)
.setAction("Cancel", new View.OnClickListener() {
@Override
public void onClick(View v) {
Utils.isFastClick();
Toast.makeText(FloatingActionBarActivity.this,"Cancel-onClick.",Toast.LENGTH_SHORT).show();
}
}).show();
在项目中所有onClick处引入isFastClick判断,一劳永逸的解决按钮重复多次点击问题,从此,xx再也不用担心我们的学习啦~
原创不易,转载请注明出处哈。
权兴权意
产品可以更优雅~
项目源代码,欢迎提建议(star)。
https://github.com/HXQWill/QuanStudy/commit/5ce1a6f6b1f775429aa2977c7735d3e2d6b87d57#diff-486f1b5424f9b8f32ae23a9fef2529b4