Android防止快速重复点击

博客介绍了Android防重点击的多种实现方式,如RxJava的throttleFirst()、Aspect AOP、记录点击时间等,并总结了一种本质为记录点击时间的方式,还给出使用示例,如1500ms内只可点击一次,且提到结合DataBinding。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android防重点击,网上有很多实现方式:RxJava 的 throttleFirst()、Aspect AOP、记录点击时间。
总结了如下一种方式:本质是记录点击时间。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
import android.view.View.OnClickListener;

public class OnClick {
  public static final long LIMIT_DURATION = 1500L;	//时间间隔:1500ms

  public OnClick() {
  }

  public static OnClickListener setOnClickListener(final OnClickListener raw) {
    return (OnClickListener)Proxy.newProxyInstance(OnClickListener.class.getClassLoader(), new Class[]{OnClickListener.class}, new InvocationHandler() {
      long lastTime;

      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (!"onClick".equals(method.getName())) {
          return method.invoke(raw, args);
        } else {
          long now = System.currentTimeMillis();
          if (now - this.lastTime >= OnClick.LIMIT_DURATION) {
            this.lastTime = now;
            return method.invoke(raw, args);
          } else {
            return null;
          }
        }
      }
    });
  }
}

使用示例:1500ms内只可点击一次
1.

button.setOnClickListener(OnClick.setOnClickListener(this));
button.setOnClickListener(OnClick.create(new View.OnClickListener() {
      @Override public void onClick(View view) {
        
      }
    }));

3.结合DataBinding

布局文件:

<layout>
	<data>
	    <import type="com.test.util.OnClick" />
	    <variable
	        name="mainModel"
	        type="com.test.MainViewModel"
	        />
	  </data>
	<Button
	        android:id="@+id/btn_test"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="test"
	        android:onClick="@{OnClick.create(mainModel.onClickListener)}"
	        />
</layout> 

com.test.MainModel.java中点击事件实现:

public View.OnClickListener onClickListener= new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      // TODO click event
    }
  };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值