1. 程式人生 > >android 防止按鈕暴力點選

android 防止按鈕暴力點選

原文連結   http://blog.csdn.net/mrzhang_happy/article/details/51087765  侵刪

onClick事件是Android開發中最常見的事件。比如,一個submitButton,功能是點選之後會提交一個訂單,
則一般程式碼如下,其中submitOrder()函式會跳轉到下一頁進行處理 :

  1. //程式碼0  
  2.     submitButton.setOnClickListener(new OnClickListener() {  
  3.         @Override  
  4.         public void onClick(View v) {  
  5.             submitOrder();  
  6.         }  
  7.     });   

正常情況下這段程式碼是沒什麼問題的,但是Android裝置的機型效能等千差萬別,如果碰到比較卡的手機,則有可能出現submitOrder()函式跳轉頁面出現延遲的現象。碰到這種現象,則使用者就很有可能再次點選一次,從而造成函式被呼叫兩次,出現重複訂單的BUG。
一般地,碰到這現象,首先就會想到的就是在點選之後把submitButton設定為不可點選:
  1. //程式碼1  
  2.    submitButton.setClickable(false);  
  3.    //或者     
  4.    submitButton.setEnabled(false); </
    code>

此方法也確實有效,不過如果submitOrder()方法沒有成功,需要再次提交訂單時又需要再重複把submitButton設定為可點選狀態。如果類似的button比較多時,就顯得比較麻煩、混亂。

方案 

自定義一個NoDoubleClickListener,繼承自OnClickListener
  1. //程式碼2  
  2.     public abstract class NoDoubleClickListener implements OnClickListener {  
  3.         public static final int MIN_CLICK_DELAY_TIME
     = 1000;  
  4.         private long lastClickTime = 0;  
  5.         @Override  
  6.         public void onClick(View v) {  
  7.             long currentTime = Calendar.getInstance().getTimeInMillis();  
  8.             if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {  
  9.                 lastClickTime = currentTime;  
  10.                 onNoDoubleClick(v);  
  11.             }   
  12.         }     
  13.     }  

使用方法—— 給submitButton設定點選事件時用NoDoubleClickListener代替OnClickListener,並且實現方法onNoDoubleClick代替onClick即可,像這樣:
  1. <spanstyle="font-size:14px;">      //程式碼3  
  2.         submitButton.setOnClickListener(new NoDoubleClickListener() {  
  3.             @Override  
  4.             public void onNoDoubleClick(View v) {  
  5.                 submitOrder();  
  6.             }  
  7.         }); </span>

原理

很簡單,見程式碼……
就是用onNoDoubleClick代替onClick處理具體的操作,在onClick方法中加一個判斷:在接收到點選事件之後,先判斷一下時間,如果距離上次處理操作不足MIN_CLICK_DELAY_TIME,就忽視——即能防止誤操作的連續點選導致重複事件。

MIN_CLICK_DELAY_TIME可調。

優勢

好處是不用改變原有程式碼的邏輯,就只需要兩個替換:NoDoubleClickListener代替OnClickListener,onNoDoubleClick代替onClick。 程式碼的結構等都不需要做改變(**對比上面的程式碼0跟程式碼**3),不需要關心處理更改button的狀態這些額外判斷邏輯,只需要關注業務邏輯即可,簡潔優雅~