【问题标题】:Android do not execute setOnTouchListener if setOnLongClickListener has been executed如果已执行 setOnLongClickListener,Android 不执行 setOnTouchListener
【发布时间】:2015-05-16 06:55:09
【问题描述】:

我有一个应用程序,您可以在其中按下屏幕并执行一个方法,您可以在其中长按并执行另一个方法。问题是,当我长按屏幕时,正常的 onClickListener 也会被执行,这是我不想要的。 它们都是简单的onClickListeners,普通的使用MotionEvent ACTION_UP。有什么办法可以防止这种情况发生吗? 所以我不想在onLongClickListener执行的时候,在普通的onTouchListener中执行ACTION_UP。

代码:

layout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {

            }
            return false;
        }
    });
    layout.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            return true;
        }
    });

【问题讨论】:

  • 如果您发布一些代码(您的听众),它会更容易帮助您。
  • 更新了问题tom包含代码

标签: java android methods onclick onclicklistener


【解决方案1】:

如果 onclick 的作用与您的预期相同,请使用 onclick 列表器而不是 ontouch,这样您在长按时不会触发 onclick。

【讨论】:

    【解决方案2】:

    如果你还想onTouch

        int flag=0
        layout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                if(flag==0){
                  //do something 
                }else{
                  flag=0;
                }
    
            }
            return false;
        }
    });
    layout.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            flag=1
            return true;
        }
    });
    

    【讨论】:

      【解决方案3】:

      LongClickClick 处于同一级别,而Touch 不在(实际上 LongClick 和 Click 是从 onTouchEvent 调度的)。

      在您的代码中,您总是在onTouch 方法中返回false,因此您不会执行该事件,它将被传递到下一个级别(LongClick,Click...),这就是为什么当您长按屏幕,这两种方法都被调用了。

      • 建议 1:

      使用ClickListener 而不是TouchListener

      • 建议 2:

      使用GestureDetector 处理所有事件(触摸、长按...)。这是example

      • 建议 3:

      使用标志来执行所需的事件。

      private boolean longClick = false;
      
      
      layout.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {
             if (longClick) {
                   longClick = false;
                }
              return false;
          }
      });
      
      layout.setOnLongClickListener(new View.OnLongClickListener() {
          @Override
          public boolean onLongClick(View v) {
              longClick = true;
              return false;
          }
      });
      
      • 建议 4:

      使用可运行的处理程序。 Example1Example2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多