2015-09-28 80 views
8

我已經在這裏看到的答案快速雙擊 - Android Preventing Double Click On A Button 和實施qezt的類似解決方案,我已經試過setEnabled(false)像這樣 -如何防止按鈕上的

doneButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
     public void onClick(View v) { 

      // mis-clicking prevention, using threshold of 1 second 
      if (SystemClock.elapsedRealtime() - doneButtonClickTime < 1000){ 
       return; 
      } 

      //store time of button click 
      doneButtonClickTime = SystemClock.elapsedRealtime(); 

      doneButton.setEnabled(false); 

      //do actual work 

     } 
    }); 

無論對超快這些工作雙擊。

注 - 處理完成後,我沒有設置doneButton.setEnabled(true)。我簡單地完成了()該活動,因此沒有太快啓用按鈕的問題。

+1

爲什麼不'的setEnabled(假)'的工作? – Blackbelt

+0

你在哪裏應用setEnabled(false);? – Sree

+0

你可以在onclick事件中給它 –

回答

8

我這樣做,它工作得很好。

public abstract class OnOneOffClickListener implements View.OnClickListener { 

    private static final long MIN_CLICK_INTERVAL=600; 

    private long mLastClickTime; 

    public static boolean isViewClicked = false; 


    public abstract void onSingleClick(View v); 

    @Override 
    public final void onClick(View v) { 
     long currentClickTime=SystemClock.uptimeMillis(); 
     long elapsedTime=currentClickTime-mLastClickTime; 

     mLastClickTime=currentClickTime; 

     if(elapsedTime<=MIN_CLICK_INTERVAL) 
      return; 
     if(!isViewClicked){ 
      isViewClicked = true; 
      startTimer(); 
     } else { 
      return; 
     } 
     onSingleClick(v);   
    } 
    /** 
    * This method delays simultaneous touch events of multiple views. 
    */ 
    private void startTimer() { 
     Handler handler = new Handler(); 

     handler.postDelayed(new Runnable() { 

      @Override 
      public void run() { 
        isViewClicked = false; 
      } 
     }, 600); 

    } 

} 
0

嘗試設置yourbutton.setClickable(假) 這樣的:

onclick(){ 
yourbutton.setClickable(false) ; 
ButtonLogic(); 
} 

ButtonLogic(){ 
//your button logic 
yourbutton.setClickable(true); 
} 
+0

嘿,我已經試過了,但如果我按下快速連續按鈕,它仍然是可點擊的。如果您在onClick()中進行計算密集型工作,我認爲禁用該按鈕或設置爲不可點擊是不夠的,因爲點擊事件可能會在按鈕被禁用之前排隊。有任何想法嗎? – Mallika

+1

我通常使用進度對話框來防止用戶在必要時與UI進行交互。如果你正在做的過程比你想要的更久,你可能想嘗試一下。 –

5

我在一個按鈕的監聽器使用這樣的函數:

public static long lastClickTime = 0; 
public static final long DOUBLE_CLICK_TIME_DELTA = 500; 

public static boolean isDoubleClick(){ 
    long clickTime = System.currentTimeMillis(); 
    if(clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){ 
     lastClickTime = clickTime; 
     return true; 
    } 
    lastClickTime = clickTime; 
    return false; 
} 
0

Qezt解決方案已經很好了。 但是,如果你想防止超快速雙擊,然後你只需降低門限

// half a second 
    if (SystemClock.elapsedRealtime() - doneButtonClickTime < 500){ 
     return; 
    } 

    // or 100ms 
    if (SystemClock.elapsedRealtime() - doneButtonClickTime < 500){ 
     return; 
    } 
1

蘇茹的回答爲我工作很好,謝謝!

我想補充的是誰在使用https://github.com/balysv/material-ripple/blob/master/library/src/main/java/com/balysv/materialripple/MaterialRippleLayout.java,面臨這個問題任何人以下的答案 -

app:mrl_rippleDelayClick默認爲true。 這意味着,只有在完成顯示波紋後,onClick纔會被執行。因此,onClick中的setEnabled(false)將延遲執行,因爲紋波未執行完畢,在此期間,您可以雙擊該視圖。

設置app:mrl_rippleDelayClick="false"來解決這個問題。這意味着只要點擊視圖,onClick就會發生,而不是等待漣漪完成顯示。

+1

這是比評論更多的評論 – Sufian

+1

發佈你的答案比評論更好。因爲我有與MaterialRippleLayout相同的問題,我找到了單獨的解決方案。謝謝@Mallika。 – Jigar

+0

@Jigar,很高興知道!沒問題 :) – Mallika

3

也許不是最有效的,但最小的反逆:

... 
onClick(View v) { 
    MultiClickPreventer.preventMultiClick(v); 
    //your op here 
} 
... 
public class MultiClickPreventer { 
    private static final long DELAY_IN_MS = 500; 

    public static void preventMultiClick(final View view) { 
     if (!view.isClickable()) { 
      return; 
     } 
     view.setClickable(false); 
     view.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       view.setClickable(true); 
      } 
     }, DELAY_IN_MS); 
    } 
} 
0
public static void disablefor1sec(final View v) { 
     try { 
      v.setEnabled(false); 
      v.setAlpha((float) 0.5); 
      v.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         v.setEnabled(true); 
         v.setAlpha((float) 1.0); 
        } catch (Exception e) { 
         Log.d("disablefor1sec", " Exception while un hiding the view : " + e.getMessage()); 
        } 
       } 
      }, 1000); 
     } catch (Exception e) { 
      Log.d("disablefor1sec", " Exception while hiding the view : " + e.getMessage()); 
     } 
    } 

我在一個靜態文件保存上面的方法,我會調用此方法對所有buttonclick這樣

button_or_textview.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      StaticFile.disablefor1sec(button_or_textview); 
      // Do Somthing. 
     } 
    }); 
0

你可以使用這種方法。通過使用帖子延遲,您可以照顧雙擊事件。

無效debounceEffectForClick(查看視圖){

view.setClickable(false); 

view.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     view.setClickable(true); 

    } 
}, 500); 

}