Android-防止用户快速点击和多控件点击

本文介绍如何在Android应用中防止用户重复点击按钮及处理多点触控问题,通过禁用点击事件和时间间隔判断,确保用户体验并避免不必要的后台处理。
原地址简书:http://www.jianshu.com/p/9d7df1895b72
1.为什么要防止用户重复点击


在用户使用App的时候,并不会乖乖的按照我们的想法而执行。

下面就拿我们熟悉的Button来:



举个栗子

假设这个Button的点击事件是“一个登录的网络请求”,这时候我们的主角-老司机小明登场了,他娴熟的输入了自己的账号和密码,然后点击了登录,静静地等候着APP的反馈跳转,可是天有不测风云,这时候网络不是很好,APP一直还未反馈 。我们的老司机也是一个暴脾气,抓着APP的那个小Button一顿乱点。欺负完Button以后,网络好了,然后无数个网络请求被发出去了,瞬间爆炸(当然你也可以优化网络请求,这里只是举个类似的例子)。


2.如何防止重复点击


方法1.屏蔽Button的点击事件

步骤一:在Button的点击事件里面

btn.setClickable(false);//设置button不可以点击

步骤二:在网络请求完成的时候(请求获得数据或者请求失败,请求取消等操作)

btn.setClickable(true);//设置button可以点击


方法2.添加标志位判断是否执行Button内的标志位

原理:每次点击button的时候,获取当前的时间,然后对比上一次的时间,两者的差值如果小于某个规定的时间,则判断为快速点击。

public class NoFastClickUtils {

               private  static long lastClickTime=0;//上次点击的时间

               private  static int spaceTime = 1000;//时间间隔

               public  static boolean isFastClick() {

                           long currentTime = System.currentTimeMillis();//当前系统时间

                           boolean isAllowClick;//是否允许点击

                          if (currentTime - lastClickTime > spaceTime) {

                                      isAllowClick= false;

                           } else {

                                      isAllowClick = true;

                             }

                          lastClickTime = currentTime;

                          return isAllowClick;

    }

}


使用方法:

在Button的点击事件里面加入如下代码:

if(NoFastClickUtils.isDoubleClick()) {

//快速点击后的逻辑,可以提示用户点击太快,休息一会

}else{

//正常点击的逻辑

}


3.为什么需要防止多点触控


在默认情况下,Android是支持多点触控的。



累了换个姿势再举个粒子


有一个界面A,A中含有2个Button。

我们这里称界面A为A女神,Button1为备胎小明,Button2为备胎小东。

A女神嘛肯定有很多备胎的联系方式,周末了A女神想找个备胎吃饭,信息已经编好了(内容自行脑补),她在思考是找小明还是小东呢?这是个值得深思的问题。想着想着,手一不小心同时点击了小明和小东。这一下蒙蔽了,A女神的尴尬癌都犯了。这时候“防止多点触控”同学为了帮助A女神解决问题,成为她广大备胎队伍中的一员勇敢的站了出来。


4.如何防止多点触控


其实很简单在2个Button的父布局中加入:

android:splitMotionEvents=”false”//不支持多点触控事件

就是这么简单,你就可以接近A女神。

还找到另一种方式:

<style name="MyStyle">

      <item name="android:windowEnableSplitTouch">false</item>

      <item name="android:splitMotionEvents>false</item>

</style>

这种方式就相当于全局设置了,可是有时候我们还是需要多点触控的,比如查看一张图片,我们需要放大看。


参考地址:

Android中防止重复点击的小技巧

android 防止对控件的重复点击和同时点击多个控件

Android 开发中,防止用户快速连续点击某个控件是一个常见的需求,尤其是在处理按钮点击事件时,避免重复触发操作,提升用户体验程序的稳定性。以下是几种常见的实现方式: ### 1. 使用时间间隔判断法 通过记录上一次点击的时间戳,并在每次点击时判断当前时间与上次点击时间的间隔是否超过指定的阈值(如 500 毫秒或 1000 毫秒),从而防止快速连续点击。 ```java private long lastClickTime = 0; private static final long MIN_CLICK_INTERVAL = 1000; // 单位为毫秒 public void onClick(View v) { long currentClickTime = System.currentTimeMillis(); if (currentClickTime - lastClickTime < MIN_CLICK_INTERVAL) { return; // 忽略点击事件 } lastClickTime = currentClickTime; // 执行点击逻辑 } ``` 该方法简单高效,适用于大数按钮点击场景[^3]。 --- ### 2. 使用工具类封装点击检测逻辑 可以将点击间隔检测逻辑封装到一个工具类中,便于在个地方复用。例如: ```java public class ClickUtils { private static long lastClickTime; public static boolean isFastClick(long interval) { long currentClickTime = System.currentTimeMillis(); if (currentClickTime - lastClickTime < interval) { return true; } lastClickTime = currentClickTime; return false; } } ``` 在按钮点击事件中使用该工具类: ```java if (!ClickUtils.isFastClick(1000)) { // 执行点击逻辑 } else { Toast.makeText(context, "请勿连续点击", Toast.LENGTH_SHORT).show(); } ``` 此方法提高了代码的可维护性,并且可以根据不同控件设置不同的防连续点击间隔[^3]。 --- ### 3. 禁用控件点击状态 在点击事件触发后,立即将控件设为不可点击状态,并在一定时间后恢复其点击状态。例如: ```java button.setClickable(false); new Handler(Looper.getMainLooper()).postDelayed(() -> button.setClickable(true), 1000); ``` 这种方式适用于某些需要执行耗时操作的按钮,如登录、提交等,可以有效防止用户点击[^2]。 --- ### 4. 使用 RxJava 防止快速点击 如果项目中使用了 RxJava,可以通过 `throttleFirst` 操作符来防止快速点击: ```java RxView.clicks(button) .throttleFirst(1, TimeUnit.SECONDS) .subscribe(unit -> { // 执行点击逻辑 }); ``` 该方法适用于响应式编程风格,能够简洁地处理点击事件流中的快速连续点击问题。 --- ### 5. 自定义控件实现防点击逻辑 对于需要统一处理控件点击的场景,可以继承 `View` 或 `Button`,在自定义控件中实现点击间隔判断逻辑,从而避免在每个点击事件中重复编写判断代码。 --- ### 总结 不同的场景适合不同的防连续点击方法,例如简单场景可使用时间戳判断法,复杂项目可结合工具类或响应式编程方式处理。在实际开发中,应根据项目结构需求选择合适的方案,以提升用户体验程序稳定性[^1]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值