在lambda表达式中使用注解防止多次点击
时间: 2023-11-17 07:06:38 浏览: 152
防止按钮在短时间内被多次点击的方法
5星 · 资源好评率100%
可以使用@SingleClick注解来防止多次点击。这个注解可以用在lambda表达式中,实现在一定时间内只响应一次点击事件。具体实现方法可以参考以下代码:
```
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface SingleClick {
long value() default 1000;//设置点击时间间隔,默认为1000毫秒
}
public class ClickUtils {
private static long lastClickTime = 0;
public static boolean isFastClick(long intervalTime) {
long time = System.currentTimeMillis();
if (time - lastClickTime < intervalTime) {
return true;
} else {
lastClickTime = time;
return false;
}
}
}
//使用注解
button.setOnClickListener(v -> {
if (!ClickUtils.isFastClick(1000)) {
//执行点击事件
}
});
//注解处理器
public class SingleClickProcessor {
public static void process(Object object) {
Method[] methods = object.getClass().getDeclaredMethods();
for (Method method : methods) {
SingleClick singleClick = method.getAnnotation(SingleClick.class);
if (singleClick != null) {
View view = getView(object, method);
view.setOnClickListener(new SingleClickListener(singleClick.value(), method, object));
}
}
}
private static View getView(Object object, Method method) {
try {
Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length == 1 && View.class.isAssignableFrom(parameterTypes[0])) {
int[] resIds = method.getAnnotation(OnClick.class).value();
if (resIds.length == 1) {
return ((Activity) object).findViewById(resIds[0]);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static class SingleClickListener implements View.OnClickListener {
private long intervalTime;
private Method method;
private Object object;
public SingleClickListener(long intervalTime, Method method, Object object) {
this.intervalTime = intervalTime;
this.method = method;
this.object = object;
}
@Override
public void onClick(View v) {
if (!ClickUtils.isFastClick(intervalTime)) {
try {
method.invoke(object, v);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
//在Activity的onCreate方法中调用注解处理器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SingleClickProcessor.process(this);
}
```
这段代码中,通过自定义@SingleClick注解和ClickUtils工具类实现了防止多次点击的功能。在lambda表达式中使用时,可以将点击事件的实现放在if语句块中,通过调用ClickUtils.isFastClick()方法来判断是否满足点击时间的间隔要求。同时,通过注解处理器SingleClickProcessor来自动化处理注解,实现更便捷的使用方式。
阅读全文