首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android:在一个按钮上防止多个onClick事件(已关闭)

Android:在一个按钮上防止多个onClick事件(已关闭)
EN

Stack Overflow用户
提问于 2012-06-01 17:57:27
回答 4查看 18K关注 0票数 20

按钮触发应该只调用一次的操作。在执行操作之前,该按钮在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)
}

即使该按钮立即被禁用,也可以通过非常快速地多次轻敲来触发多个"onClick“事件。(即performTaskOnce被多次调用)。在按钮实际被禁用之前,onClick事件似乎已排队。

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

这个问题发生在Android 2.3.6上,我不能在Android 4.0.3上重现它。但考虑到4.x设备的稀缺性,不能选择排除较旧的设备。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-01 20:43:04

您可以在单击按钮时将布尔变量设置为true,并在处理完单击时将其设置为false。

通过这种方式,您可以忽略多次单击,并且不必禁用按钮,可能会避免恼人的按钮闪烁。

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)
}
票数 8
EN

Stack Overflow用户

发布于 2014-03-14 02:46:21

为了保持DRY

// 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
            }
        });
    }
}
票数 6
EN

Stack Overflow用户

发布于 2014-03-24 15:19:22

有点晚了,但这可能对某些人有用。在我的例子中,我称之为另一个活动,所以;

声明一个布尔值;

boolean clickable;

在listener中单击;

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

调用onResume时启用;

@Override
public void onResume() {
    Log.e(TAG, "onResume");
    super.onResume();
    clickable = true;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10848157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档