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性,不能排除旧设备。

  • Android RecyclerView添加和删除项目
  • 如何检测“Recent Apps”系统button点击(Honeycomb +)
  • Dialog.setContentView(View)和AlertDialog.setView(View)之间有什么区别?
  • 如何更改选项菜单的背景颜色?
  • Androidbutton以编程方式在Java中声明(不是XML)
  • Android M光明和黑暗的状态栏编程 - 如何使它再次黑暗?
  • 在TextEdit中设置提示的字体
  • Android - 如何将数据传递给runnable在runOnUiThread?
  • 您可以在单击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

    希望它有帮助