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

本文介绍如何防止Android应用中按钮的重复点击,并通过全局变量控制同一时间只显示一个弹出框,还讨论了back按键的监听方法。

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

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

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

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

 

public abstract class NoDoubleClickListener implements View.OnClickListener {

    /**
     * 控制不可连续点击的时间间隔[  修改控制时间间隔  ]
     */
    public static final int MIN_CLICK_DELAY_TIME = 100000;//大时间间隔用于测试
    /**
     * 上一次点击的时间
     */
    private long lastClickTime = 0;

    @Override
    public 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;

    @Override
    protected 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() {
            @Override
            public void onNoDoubleClick(View view) {
                numMarkBtWhole++;
                numMarkBt++;
                Toast.makeText(MainActivity.this, "clickBt被第" + numMarkBt + "次击中!总共点击" + numMarkBtWhole + "次", Toast.LENGTH_SHORT).show();
            }
        });

        clickBtOther.setOnClickListener(new NoDoubleClickListener() {
            @Override
            public 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">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="一个按钮短时间内不可重复点击" />

    <Button
        android:id="@+id/bt_click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击" />

    <Button
        android: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() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "确定!龙啸~~~", Toast.LENGTH_SHORT).show();
                    isDialogShowIng = false;
                }
            });
            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "取消!绝世神功与您檫肩而过~~", Toast.LENGTH_SHORT).show();
                    isDialogShowIng = false;
                }
            });
            builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public 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() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
//                            isDialogShowIng = false;
                        }
                    }).setNegativeButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
//                            isDialogShowIng = false;
                        }
                    }).create();
            dialog.show();
            dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialog) {
                    isDialogShowIng = false;
                    dialog.cancel();
                }
            });
            isDialogShowIng = true;
        }
    }

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

 

三、back事件监听

       1,第一种方式

 

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

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

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

 

         2,第二种方式

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值