Android: GestureDetector не работает (gestureDetector.onTouchEvent (event) всегда false) с вкладками (TabActivity, Tabwidget)

я реализовал свою 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 и т. д. как показано во многих учебниках.

но моя проблема в том, что когда я хочу проверить жест броска, мой 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, например, как активность запуска. Но я не могу заставить его работать в TabActivity. Я уже пытался добавить GestureDetector к TabActivity, но он не работает. Я попытался для добавления GestureDetector к конкретным видом, как некоторые виды макета или кнопки, ViewFlippers и т. д. но это просто не работает. Когда я отлаживаю, я вижу, что событие touch запускается и регистрируется движение, но оно просто не оценивается как бросок или любой другой жест.

Итак, мой вопрос: существуют ли какие-либо ограничения в отношении использования GestureDetectors с вкладками в Android? Как я уже сказал, жесты регистрируются совершенно вне TabActivity.

Я был бы очень признателен за помощь того, кто знает ответ. Если есть ограничение, как кто-то может получить обходной путь для этой проблемы?

заранее спасибо за ответы.

2 ответов


взгляните на упомянутый ответ здесь. Он в значительной степени сделал то же самое, что и вы, но если вы посмотрите на первый комментарий к ответу с самым высоким рейтингом, Cdsboy заставил его работать, реализовав OnDown и вернув true. Я не уверен, зачем это нужно, но это сработало для меня.


в качестве дополнения к ответу @Abhinav (это кстати мне тоже помогло), я хотел бы сказать, что я думаю, переопределяя onDown() необходимо, потому что его реализация по умолчанию в SimpleOnGestureListener - вернуть false. Бытие ACTION_DOWN первый, кто достигнет слушателя, заставит его отказаться от события, что бы это ни было.