首页 文章

Android:GestureDetector不工作(gestureDetector.onTouchEvent(event)总是false)带Tabs(TabActivity,Tabwidget)

提问于
浏览
9

我已经使用不同的子活动实现了我的TabActivity:

intent = new Intent().setClass(this, MyChildTabActiviy.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = getTabHost.newTabSpec("tag").setIndicator("indicator", getResources().getDrawable(R.drawable.icon)).setContent(intent);
getTabHost.addTab(spec);
...

到目前为止没有问题,一切都很好 . 我在选项卡之间以编程方式切换,用ActivityGroups替换选项卡中的活动等,正如许多教程中所示 .

但我的问题是,当我想检查一个fling手势时,我的gestureDetector.onTouchEvent(event)总是返回false,因此没有注册任何手势 .

这是我对gestureDetector的实现:

public class MyChildTabActiviy extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ... building views, controls, etc.
        GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector());
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }
 class MyGestureDetector extends SimpleOnGestureListener {
  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
   if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
    return false;
   // left to right swipe and right to left swipe
   if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
     && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    //... fling logic ...
    return true;
   } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
     && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    //... fling logic ...
    return true;
   }
   return false;
  }
 }

问题是,当我在TabActivity之外开始这些活动(有四种基本活动,我有时会切换到其他活动)时,这个代码(以及fling检测)工作得很好,例如作为启动器活动 . 但我不能让它在TabActivity中工作 . 我已经尝试将GestureDetector附加到TabActivity,但它不起作用 . 我试图将GestureDetector附加到特定的视图,如一些布局视图或按钮,ViewFlippers等,但它只是不起作用 . 当我正在调试时,我可以看到触发事件被触发并且注册了一个动作,但它不会被评估为投掷或任何其他手势 .

所以我的问题是,在Android中使用带有标签的GestureDetectors有任何限制吗?正如我所说,手势完全在TabActivity之外注册 .

我非常感谢知道答案的人的帮助 . 如果存在限制,有人可以为该问题找到解决方法吗?

提前谢谢你的答案 .

2 回答

  • 7

    作为@Abhinav的补充's answer (that btw helped me too), I' d喜欢说我认为重写 onDown() 是必要的,因为它在 SimpleOnGestureListener 中的默认实现是返回 false . 作为第一个到达听众的人,它将使它丢弃事件,无论它是什么 .

  • 22

    看看here提到的答案 . 他不知道为什么需要这样做,但它对我有用 .

相关问题