Android onClick阻止onFling

我有一个Activity,它实现了一个Gesture Detector来捕获用户输入导航到其他屏幕的输入.这工作正常 – 但是 – 我最近更新了一个派生自BaseActivity的类来添加onClick函数,现在click事件似乎阻止onFling被击中. onClick与我在屏幕上的TextView区域(在LinearLayout中)相关联. resultsClick方法使用 XML布局中的onClick属性连接到TextView.

我试过在没有运气的情况下更改onSingleTapUp和onDown的返回值.我也尝试过将log语句添加到下面的所有函数中.当我在TextView区域中投掷时,它们都不会触发,但它们会在屏幕的其他区域上触发.

也许我使用了错误搜索词,但我似乎无法找到解决这个问题的例子 – 但我确信此问题已经解决过了.

public class DerivedActivity extends BaseActivity
{
   ...
   /**
    * resultsClick - The user clicked on the Results area
    * @param v
    */
   public void resultsClick(View v)
   {
      try
      {
         Log.i(this.toString(),"resultsClick");
         startActivity(new Intent(this,Results_TabHost.class ));
      }
      catch (Exception e)
      {
         Log.e(this.toString(),"Exception" + e.toString());
      }

   }// end resultsClick
   ...
}

这是实现GestureListener代码的基类

public class BaseActivity extends    ActivityGroup 
                          implements OnGestureListener
{
   ...
   private static final int SWIPE_MIN_disTANCE = 120;
   private static final int SWIPE_MAX_OFF_PATH = 250;
   private static final int SWIPE_THRESHOLD_VELociTY = 200;

   public boolean onFling(MotionEvent e1,MotionEvent e2,float veLocityX,float veLocityY)
   {
      try
      {
         Log.i(this.toString(),"onFling");

         // jump right out if not a swipe/fling
         if (Math.abs( e1.getY() - e2.getY() ) > SWIPE_MAX_OFF_PATH)
         {
            return false;
         }

         // right to left swipe
         if (e1.getX() - e2.getX() > SWIPE_MIN_disTANCE && 
             Math.abs(veLocityX)   > SWIPE_THRESHOLD_VELociTY )
         {
            Log.i(this.toString(),"fling left");
            rightArrowClick(null);

         }
         else if (e2.getX() - e1.getX() > SWIPE_MIN_disTANCE && 
                  Math.abs(veLocityX)   > SWIPE_THRESHOLD_VELociTY )
         {
            Log.i(this.toString(),"fling right");
            leftArrowClick(null);
         }
      }
      catch (Exception e)
      {
         Log.e(this.toString(),"Exception" + e.toString());
      }

      return true;

   }// end onFling

   // These next methods we are required to have - even if unused - 
   // in order for the Gesture Handling to work

   @Override
   public boolean onTouchEvent(MotionEvent motionEvent)
   {
      return this.gestureDetector.onTouchEvent(motionEvent);
   }

   @Override
   public void onLongPress(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
   }

   @Override
   public boolean onScroll(MotionEvent e1,float distanceX,float distanceY)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }

   @Override
   public void onShowPress(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
   }

   @Override
   public boolean onSingleTapUp(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }

   @Override
   public boolean onDown(MotionEvent e)
   {
      // Intentionally not handling - must be overridden by listener class
      // Intentionally returning true - per code examples
      return true;
   }
...
}

解决方法

您的onTouchEvent实现不正确.
您只需返回gestureDector结果的值即可.

但是,如果您的手势检测器未检测到任何手势,则告诉来电者“我这里没有任何事情可做”,触摸事件将永远不会发送给活动的孩子.

如果你的手势探测器没有处理事件,你需要调用super.onTouchEvent().

@Override
public boolean onTouchEvent(MotionEvent motionEvent)
{
  if(this.gestureDetector.onTouchEvent(motionEvent))
  {
      return true;
  }
  //no gesture detected,let Activity handle touch event
  return super.onTouchEvent(motionEvent);
}

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...