android 防止按鈕暴力點選
阿新 • • 發佈:2019-01-08
原文連結 http://blog.csdn.net/mrzhang_happy/article/details/51087765 侵刪
onClick事件是Android開發中最常見的事件。比如,一個submitButton,功能是點選之後會提交一個訂單,
則一般程式碼如下,其中submitOrder()
函式會跳轉到下一頁進行處理
:
- //程式碼0
- submitButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
-
submitOrder();
- }
- });
正常情況下這段程式碼是沒什麼問題的,但是Android裝置的機型效能等千差萬別,如果碰到比較卡的手機,則有可能出現submitOrder()函式跳轉頁面出現延遲的現象。碰到這種現象,則使用者就很有可能再次點選一次,從而造成函式被呼叫兩次,出現重複訂單的BUG。
一般地,碰到這現象,首先就會想到的就是在點選之後把submitButton設定為不可點選:
- //程式碼1
- submitButton.setClickable(false);
- //或者
-
submitButton.setEnabled(false); </
此方法也確實有效,不過如果submitOrder()方法沒有成功,需要再次提交訂單時又需要再重複把submitButton設定為可點選狀態。如果類似的button比較多時,就顯得比較麻煩、混亂。
方案
自定義一個NoDoubleClickListener
,繼承自OnClickListener
:- //程式碼2
- public abstract class NoDoubleClickListener implements OnClickListener {
-
public static final int MIN_CLICK_DELAY_TIME
- 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);
- }
- }
- }
使用方法—— 給submitButton設定點選事件時用NoDoubleClickListener代替OnClickListener,並且實現方法onNoDoubleClick代替onClick即可,像這樣:
- <spanstyle="font-size:14px;"> //程式碼3
- submitButton.setOnClickListener(new NoDoubleClickListener() {
- @Override
- public void onNoDoubleClick(View v) {
- submitOrder();
- }
- }); </span>
原理
很簡單,見程式碼……
就是用onNoDoubleClick代替onClick處理具體的操作,在onClick方法中加一個判斷:在接收到點選事件之後,先判斷一下時間,如果距離上次處理操作不足MIN_CLICK_DELAY_TIME,就忽視——即能防止誤操作的連續點選導致重複事件。
MIN_CLICK_DELAY_TIME可調。