2011-12-16 87 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'的答案,并且融入这个代码,其中可点击变量的变化值....