11

我已经用不同的子活动实现了我的 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,因此没有注册手势。

这是我对手势检测器的实现:

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 等,但它不起作用。当我调试时,我可以看到触发了触摸事件并注册了一个动作,但它并没有被评估为一个投掷或任何其他手势。

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

我将非常感谢知道答案的人的帮助。如果有限制,有人怎么能找到解决该问题的方法?

提前感谢您的回答。

4

2 回答 2

23

看看这里提到的答案。他几乎和你做了同样的事情,但是如果你看一下对最高评价答案的第一条评论,Cdsboy 通过实现 OnDown 并返回 true 让它工作。我不确定为什么需要这样做,但它对我有用。

于 2010-12-11T13:03:11.350 回答
7

作为对@Abhinav 答案的补充(顺便说一句,这对我也有帮助),我想说我认为onDown()需要覆盖,因为它的默认实现SimpleOnGestureListener是 return false。作为ACTION_DOWN第一个到达侦听器的人,它将使其丢弃事件,无论它是什么。

于 2010-12-11T16:49:19.613 回答