Android快速點擊的屏蔽和多彈出框的攔截

一、屏蔽同一個按鈕的快速點擊

       同一個按鈕,在一般情形下,不需要在極短的時間內連續點擊很多次。當然,類似咻一咻的功能除外。屏蔽同一個按鈕的快速點擊,普通的情形有設置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,不消耗事件。
       當第二種方式存在時,第一種方式不再有用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章