Android: GestureDetector не работает (gestDetector.onTouchEvent (событие) всегда ложно) с вкладками (TabActivity, Tabwidget) - PullRequest
10 голосов
/ 09 декабря 2010

Я реализовал свой 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 и т. Д., Как это показано во многих руководствах.

Но моя проблема в том, что когда я хочу проверить жест броска, мой gestDetector.onTouchEvent(событие) всегда возвращает ложь, поэтому жест не регистрируется.

Это моя реализация gestDetector:

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

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

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

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

Ответы [ 2 ]

22 голосов
/ 11 декабря 2010

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

7 голосов
/ 11 декабря 2010

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

...