【问题标题】:Cancel Touch Eventbutt取消触摸事件对接
【发布时间】:2015-02-08 18:03:31
【问题描述】:

我正在编写一个具有以下场景的非常简单的应用程序:

1) 屏幕A3个按钮可以在其他屏幕上移动。

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

3) 而且更奇怪。在其他屏幕上移动后,如果我不释放 屏幕 A 上的 Button 1,那么它仍然允许单击 屏幕 A 的其余两个按钮 甚至我可以看到第二个屏幕。

这里很明显启动第二个屏幕,但第一个屏幕按钮事件仍然有效。 知道如何避免这种情况。

【问题讨论】:

  • it launch multiple instance of other screen. Which I think should not be happened. How can prevent this. 请出示您的代码?
  • @Outofmemory Hardik..您可以在大多数标准应用程序中找到此问题。我检查了FB_和YahooNews_应用程序..你只需要按住任何一个按钮,然后开始点击任何其他按钮..即使你在其他页面上也继续点击(条件相同..按住屏幕的一个按钮)。
  • 我不认为这应该是一件麻烦事。想要在随机应用上做体操的用户是极少数(不到 0.1%?)。这不再是“如果用户想要这样做,即使他不应该这样做”,这完全是错误的。
  • 感谢@Shywim 可能是这样,但这应该被处理......考虑以下场景,1)使用基于片段的环境,2)有一些按钮(用于启动对话框)和列表项启动一些其他活动然后发生的对话框将在下一个屏幕上启动。
  • @Shubh 我是对的,您想禁用按钮上的多点触控吗?您可以在这里寻找可能的解决方案:stackoverflow.com/a/15641505/1533933

标签: android onclick ontouchlistener


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-04
      • 1970-01-01
      • 2018-01-19
      • 2019-03-08
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      相关资源
      最近更新 更多