取消触摸Eventbutt

时间:2014-12-10 13:54:35

标签: android onclick ontouchlistener

我正在编写一个非常简单的应用程序,其中包含以下场景:

1)屏幕A 3按钮可在其他屏幕上移动。

2)现在如果我按住一个按钮(比如按钮1)并快速点击其他按钮,那么它会启动其他屏幕的多个实例。我认为不应该发生这种情况。如何防止这种情况。

3)它更奇怪。如果我没有在屏幕A 上发布按钮1 ,则在其他屏幕上移动后,仍然允许执行点击以暂停的两个按钮屏幕A 即使我可以看到第二个屏幕。

此处它清晰启动第二个屏幕,但仍然是第一个屏幕按钮事件工作。 任何想法如何避免这种情况。

2 个答案:

答案 0 :(得分:0)

我找到的一个解决方案是在 onPause()中禁用点击监听器,并在 onResume()中启用它。我们可以为此提供更好的支持吗?

答案 1 :(得分:0)

如果启用1,您将如何禁用其他按钮,这是一个算法问题。您可以尝试在活动中创建布尔值或控件变量(然后将活动的最终引用传递到您需要的任何位置),或者在静态上下文中。但要回答问题的标题 - 您可以通过添加OnTouchListener来“取消触摸事件”,或者如果您要扩展类按钮,则可以覆盖onTouchEvent(MotionEvent ev)方法。

使用OnTouchListener将禁用任何先前定义的触摸事件行为。您可以通过从按钮调用performClick方法从内部调用实际的点击事件。

//in order to use button inside OnTouchEvent, its reference must be final
//if it's not, create a new final reference to your button, like this:
final finalButton = button;

button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // ... additional code if necessary
        if(canBeClicked) {
            finalButton.performClick();
            return true;
        }
        else return false;
    }
}

在类扩展Button中覆盖onTouchEvent应该看起来像这样。

@Override
public boolean onTouchEvent(MotionEvent ev) {
    // ... additional code if necessary

    //here we don't really need to call performClick(), although API recommends it
    //we just send the touch event to the super-class and let it handle the situation.
    if(activity.canBeClicked) return super.onTouchEvent(ev);
    else return false;
}