2011-12-16 126 views

回答

5

禁用按鈕是不夠的,還應該使按鈕無法點擊與setClickable(false)

setEnabled()只會更改按鈕,這將繼續接收點擊事件的出現。

+0

LadaRaider,這個作品真的很好。這很簡單,只是簡單的作品。謝謝! – EpicOfChaos 2011-12-16 04:11:10

2

在我看來,最好的辦法是控制運行Web服務。爲您的Web服務通信設置一個布爾值。這樣的事情(在僞代碼,不記得的Android多)

private boolean webServiced = false; 

public synchronized void startWebService(){ 
    if (!webServiced){ 
     webServiced = true; 
     //run your web service call on separate thread or something 
    } 
} 

public synchronized void onWebServiceDone(){ 
    webServiced = false; 
    myButton.setClickable(true) 
} 

public void onButtonClick(Event e){ 
    startWebService(); 
    myButton.setClickable(false) 
} 

請告訴我這裏重要的是WebService的方法需要被同步這樣就可以保證只有一個線程在訪問webServiced布爾時間。有了這個,即使用戶在setClickable(false)開始前多次單擊按鈕,您的Web服務仍將只運行一次。

+0

我認爲這可行,但它是一個過於複雜的解決方案。我將正確地授予LadaRaider。 – EpicOfChaos 2011-12-16 04:12:07

0

總之,禁用按一下按鈕,然後從服務消費者函數/方法的回調重新啓用它。

+0

啓用和禁用該按鈕不足以防止再次單擊。 – EpicOfChaos 2011-12-16 04:12:32

1

這是一個通用的解決方案,你可以在你的代碼中使用您的具體情況和其他地方上的任何按鈕,甚至如果事件是一個異步調用。

然後爲你的web服務端點,當你得到一個答覆,超時或類似的,調用運行的通過,這將您的按鈕復位到幸福點擊一次。見下面類:

public abstract class OneClickListener implements View.OnClickListener { 

private boolean clickable = true; 
private Runnable reactivateButtonRunnable; 

@Override 
public final void onClick(final View v) { 
    if (clickable) { 
     clickable = false; 
     reactivateButtonRunnable = new Runnable() { 
      @Override 
      public void run() { 
       reset(); 
      } 
     }; 
     onOneClick(v, reactivateButtonRunnable); 
    } 
} 

public abstract void onOneClick(View v, final Runnable reactivateButtonRunnable); 

// reset listener to accept new clicks 
public void reset() { 
    clickable = true; 
} 
} 

例如僞代碼,只是爲了顯示原理:

Button button = new Button(this); 
button.setOnClickListener(new OneClickListener() { 
     @Override 
     public void onOneClick(View v, Runnable reactivateButtonRunnable) { 
      launchWebService(reactivateButtonRunnable); 
     } 
    }); 

public void launchWebService(final Runnable reactivateButton){ 
    // 
    doRequest(new OnResponseListener(){ 
    @Override 
    public void onSuccess(){ 
     // your custom code 
     reactivateButton.run(); // makes button clickable again here 
    } 
    @Override 
    public void onTimeout(){ 
     // your custom code 
     reactivateButton.run(); // makes button clickable again here 
    } 
    @Override 
    public void onFailure(){ 
     // your custom code 
     reactivateButton.run(); // makes button clickable again here 
    } 
}); 
} 

注:這並不妨礙Android的從你的按鈕排隊點擊事件,但可以防止你的代碼執行。

如果您還想禁用按鈕,看到Dalmas'的答案,並且融入這個代碼,其中可點擊變量的變化值....