Android快速点击的屏蔽和多弹出框的拦截

2024-08-28 01:08

本文主要是介绍Android快速点击的屏蔽和多弹出框的拦截,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、屏蔽同一个按钮的快速点击

       同一个按钮,在一般情形下,不需要在极短的时间内连续点击很多次。当然,类似咻一咻的功能除外。屏蔽同一个按钮的快速点击,普通的情形有设置setClickable属性。在点击实现,首先将该对象置为不可点击。注意事项是,需要考虑不同情形下,将该按钮属性修改回来。

       修改点击事件,是另一种方法。

 

public abstract class NoDoubleClickListener implements View.OnClickListener {/*** 控制不可连续点击的时间间隔[  修改控制时间间隔  ]*/public static final int MIN_CLICK_DELAY_TIME = 100000;//大时间间隔用于测试/*** 上一次点击的时间*/private long lastClickTime = 0;@Overridepublic void onClick(View v) {long currentTime = Calendar.getInstance().getTimeInMillis();if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {lastClickTime = currentTime;onNoDoubleClick(v);}}public abstract void onNoDoubleClick(View view);
}

        具体使用:

 

public class MainActivity extends AppCompatActivity {/*** 点击按钮*/private Button clickBt;/*** 不同的点击触发点*/private Button clickBtOther;/*** 次数记录*/private int numMarkBt = 0;private int numMarkBtOther = 0;private int numMarkBtWhole = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);clickBt = (Button) findViewById(R.id.bt_click);clickBtOther = (Button) findViewById(R.id.bt_click_other);clickBt.setOnClickListener(new NoDoubleClickListener() {@Overridepublic void onNoDoubleClick(View view) {numMarkBtWhole++;numMarkBt++;Toast.makeText(MainActivity.this, "clickBt被第" + numMarkBt + "次击中!总共点击" + numMarkBtWhole + "次", Toast.LENGTH_SHORT).show();}});clickBtOther.setOnClickListener(new NoDoubleClickListener() {@Overridepublic void onNoDoubleClick(View view) {numMarkBtWhole++;numMarkBtOther++;Toast.makeText(MainActivity.this, "clickBtOther被第" + numMarkBtOther + "次击中!总共点击" + numMarkBtWhole + "次", Toast.LENGTH_SHORT).show();}});}/*** 当前方式必须使用内部类的形式,不再能够使用统一Onclick来处理的模式** NoDoubleClickListener类中标记需要针对不同的控件区分开*/}

        布局文件:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="一个按钮短时间内不可重复点击" /><Buttonandroid:id="@+id/bt_click"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点击" /><Buttonandroid:id="@+id/bt_click_other"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="另一个点击" /></LinearLayout>

         当前方式的弊端是不能同时处理所有的Click事件,只能每个点击事件使用内部类实现【匿名/命名】。
         点击事件的时间间隔可以控制,通过调整变量的大小实现。

您想要的源码~_~

二、多弹出框的拦截

在一个移动应用中,一个时间存在的弹出框应该只有一个。通过设置不同按钮的点击事件弹出弹出框,则会出现,同时点击多个按钮,会出现多个弹出框,不符合实际的需求。通过添加全局控制变量,实现同一时间只有一个弹出框效果。

1,第一种Dialog展示

 

   private void showDialog() {if (!isDialogShowIng) {AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setTitle("确定弹出框");builder.setMessage("确定练就降龙十八掌?");builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "确定!龙啸~~~", Toast.LENGTH_SHORT).show();isDialogShowIng = false;}});builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "取消!绝世神功与您檫肩而过~~", Toast.LENGTH_SHORT).show();isDialogShowIng = false;}});builder.setOnDismissListener(new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {isDialogShowIng = false;}});builder.show();isDialogShowIng = true;}}

       builder.setOnDismissListener()必须在Builder.show()之前使用,否则没有效果。
       builder.setOnDismissListener()设置的监听器是无论确定、取消等让Dialog消失,还是点击其他区域以及返回键让Dialog消失,都能够执行。

       返回键点击,让弹出框消失的事件,监听器监听不到,需要找到原因。

       

    /*** 弹出框是否正在显示【系统全局变量】*/public static boolean isDialogShowIng = false;

      

      2,第二种Dialog展示

 

    private void showSecondDialog() {if (!isDialogShowIng) {Dialog dialog = new AlertDialog.Builder(this).setMessage("您确定进入系统吗?").setTitle("是否准备进入系统").setIcon(R.mipmap.ic_launcher).setPositiveButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();
//                            isDialogShowIng = false;}}).setNegativeButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();
//                            isDialogShowIng = false;}}).create();dialog.show();dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {isDialogShowIng = false;dialog.cancel();}});isDialogShowIng = true;}}

      dialog.setOnDismissListener()的事件监听设置与顺序无关。在show()之前之后都行。

 

三、back事件监听

       1,第一种方式

 

    @Overridepublic void onBackPressed() {if (isDialogShowIng) {isDialogShowIng = false;}System.out.println("按下了back键   onBackPressed()");
//        super.onBackPressed();}

        super.onBackPressed();不能使用,使用的时候,则不能实现监听。

消耗事件,若是需要退出程序操作,当前方法中需要重写。

 

         2,第二种方式

 

    @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {if (isDialogShowIng) {isDialogShowIng = false;}return false;} else {return true;}}

       返回true时,消耗事件;返回false,不消耗事件。
       当第二种方式存在时,第一种方式不再有用。

这篇关于Android快速点击的屏蔽和多弹出框的拦截的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113298

相关文章

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按