Android:防止button上的多个onClick事件(已被禁用)

一个button触发一个只能被调用一次的动作。 在执行操作之前,该button被禁用并隐藏在onClick处理程序中:

someButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { someButton.setEnabled(false); someButton.setClickable(false); someButton.setVisibility(View.GONE); performTaskOnce(); } }); private void performTaskOnce() { Log.i("myapp", "Performing task"); //Do something nontrivial that takes a few ms (like changing the view hierarchy) } 

即使该button被立即禁用,但仍然可以通过快速点击多次触发多个“onClick”事件。 (即performTaskOnce被称为多次)。 在button被实际禁用之前,似乎onClick事件已排队。

我可以通过检查每个onClick句柄来解决问题,相应的button是否已被禁用,但似乎是一个黑客。 有没有更好的方法来避免这个问题?

这个问题出现在Android 2.3.6上,我无法在Android 4.0.3上重现它。 但鉴于4.x设备的稀less性,不能排除旧设备。

Solutions Collecting From Web of "Android:防止button上的多个onClick事件(已被禁用)"

您可以在单击button时将布尔variables设置为true,并在完成点击后将其设置为false。

这样,您可以忽略多个点击,而不必禁用button,可能避免烦人的button闪烁。

 boolean processClick=true; someButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(processClick) { someButton.setEnabled(false); someButton.setClickable(false); someButton.setVisibility(View.GONE); performTaskOnce(); } processClick=false; } }); private void performTaskOnce() { Log.i("myapp", "Performing task"); //Do something nontrivial that takes a few ms (like changing the view hierarchy) } 

为了保持干爽 :

 // Implementation public abstract class OneShotClickListener implements View.OnClickListener { private boolean hasClicked; @Override public final void onClick(View v) { if (!hasClicked) { onClicked(v); hasClicked = true; } } public abstract void onClicked(View v); } // Usage example public class MyActivity extends Activity { private View myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView.setOnClickListener(new OneShotClickListener() { @Override public void onClicked(View v) { // do clicky stuff } }); } } 

有点晚了,但这可能对某人有用。 在我的情况下,我打电话给另一个活动。

声明一个布尔值;

 boolean clickable; 

在点击监听器中;

 if(clickable){ // Launch other activity clickable = false; } 

当onResume被调用时启用;

 @Override public void onResume() { Log.e(TAG, "onResume"); super.onResume(); clickable = true; } 

声明一个varieble并使用它

  boolean boo = false; someButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(boo==false){ someButton.setEnabled(false); someButton.setClickable(false); someButton.setVisibility(View.GONE); boo = true; } } }); 

通过这个,你可以防止多次点击你的button

希望它有帮助