Android 最省代码的双击判断

来源:互联网 发布:局域网共享打印软件 编辑:程序博客网 时间:2024/05/16 05:48

前言:我们在做项目的时候,经常会碰到这种情况:一个控件的点击事件,当点击速度过快的时候——一般是双击,点击事件会响应两次,而Android系统中没有双击这个判断,这个时候就需要我们自己来写一个,于是在网上看了一下。思路一般是保存按钮的点击时间,判断时间差,以此用来判断是否是双击,而在做项目的时候,发现有个不方便的地方,每次点击事件中都需要写一次,于是,为了简化代码,我在此基础上做了些许改动,能够简化些许代码,废话少说,看代码:

import android.app.Activity;import android.util.SparseArray;import android.view.View;import java.util.HashMap;import java.util.Map;import io.reactivex.Flowable;import io.reactivex.schedulers.Schedulers;/** * 点击事件的工具类 */public class ClickUtil {    //activity中的view的集合    private static Map<Activity, SparseArray<Long>> viewIdMap = new HashMap<>();    public static boolean isDoubleClick(Activity activity, View view) {        return isDoubleClick(activity, 1000, view);    }    //遍历当前activity内的view对应的点击时间    public static boolean isDoubleClick(Activity activity, long time, View view) {        //判断当前activity是否有对应的数据        if (!viewIdMap.containsKey(activity)) {            SparseArray<Long> viewIdArray = new SparseArray<>();            viewIdArray.put(view.getId(), System.currentTimeMillis());            viewIdMap.put(activity, viewIdArray);            return false;        }        //view对应的点击时间数据        SparseArray<Long> viewIdArray = viewIdMap.get(activity);        //rxJava循环        return Flowable.just(viewIdArray).subscribeOn(Schedulers.newThread()) //子线程内                //遍历输出view的id:转换为string格式,long格式在null值的情况下会报错                .map(longSparseArray -> String.valueOf(viewIdArray.get(view.getId())))                .to(longObservable -> { //view的id                    String viewTime = longObservable.blockingFirst(); //获取view对应的点击时间                    if (viewTime.equals("null")) { //转换为string格式,默认为 "null" 值                        viewIdArray.put(view.getId(), System.currentTimeMillis());                        return false;                    } else {                        long lastClickTime = System.currentTimeMillis();                        if (lastClickTime - Long.parseLong(viewTime) < time) {                            viewIdArray.put(view.getId(), lastClickTime);                            return true;                        }                        viewIdArray.put(view.getId(), lastClickTime);                        return false;                    }                });    }    //移除view的数据    public static void removeClickView(Activity activity) {        if (viewIdMap.containsKey(activity)) {            viewIdMap.remove(activity);        }    }}


双击判断与网络的大部分一样,通过判断点击事件差来判断是否是双击,而在其中做的改良是,保存所有按钮的点击时间,简化代码;

用法:

public void onClick(View view) {        //判断是否是双击:是双击则直接退出        if (ClickUtil.isDoubleClick(this, view)) {            return;        }        switch (view.getId()) {            case R.id.one:                               break;            case R.id.two:                              break;            case R.id.three:                                break;            case R.id.four:                               break;            case R.id.five:                                break;        }    }
这样写就简单多了,至少不用在每个点击事件当中都写一次,当然,这个只是写了onclick里面的判断;

最后,别忘了清除数据:

    @Override    protected void onDestroy() {        super.onDestroy();        //移除当前activity的点击        ClickUtil.removeClickView(this);    }
这段代码可以写一个BaseActivity用来统一父类方法,就不用在每个activity中写一遍;
转载请保留原文地址;

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 马桶排水阀漏水怎么办 真人cs不会玩怎么办 pp助手安装失败怎么办 ipad屏幕一直闪怎么办 ipad丢失被抹掉怎么办 苹果ipad丢失了怎么办 苹果ipad丢了怎么办 空间相册没有了怎么办 51帐号被注销怎么办 邮箱密码忘记了怎么办 网易邮箱忘记了怎么办 邮箱账号忘记了怎么办 邮箱帐号忘记了怎么办 163邮箱忘记了怎么办 苹果邮箱忘记了怎么办 校园一卡通丢了怎么办 yy手机号码丢了怎么办 唱歌跑调的人怎么办 yy账号忘了怎么办 边锋通行证忘了怎么办 qq游戏安装不了怎么办 手机url无法获取怎么办 cad卸载不干净怎么办 cs6卸载不干净怎么办 ps图片放大模糊怎么办 电脑关机关不了怎么办 cad块无法分解怎么办 xy导入铃声失败怎么办 微信转账转错人怎么办 支付宝转账限额怎么办 银行转账错了怎么办 微信提款没到账怎么办 转账转多了怎么办 微信转账错不还怎么办 戴美瞳眼镜红了怎么办 戴隐形眼镜眼干怎么办 带隐形眼镜眼睛干涩怎么办 戴隐形眼睛干涩怎么办 隐形眼睛红血丝怎么办 戴隐形眼睛红怎么办 手机在家丢了怎么办