触摸ActionBarActivity内的事件

时间:2015-02-02 18:22:51

标签: android tabs ontouchlistener fragment-tab-host gesturedetector

我在support7 ActionBarActivity中有三个标签,其中包含一个support4 FragmentTabHost。它主要是工作,并点击标签标题切换到正确的片段。

我尝试添加GestureDetector,以便向左/向右滑动会更改标签。 (我知道现在有更多的现代容器,但现在让我们坚持使用FragmentTabHost。)

class MainGestureDetector extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            final int current = tabHost.getCurrentTab();
            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                if (current < tabHost.getTabWidget().getTabCount() - 1) {
                    tabHost.setCurrentTab(current + 1);
                }
            }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                if (current > 0) {
                    tabHost.setCurrentTab(current - 1);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.onFling(e1, e2, velocityX, velocityY);
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }
}

并实例化:

    gestureDetector = new GestureDetector(this, new MainGestureDetector());
    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            return gestureDetector.onTouchEvent(event);
        }
    };

    tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
    tabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent);

    tabHost.setOnClickListener(this);
    tabHost.setOnTouchListener(gestureListener);

有效!但只在第一个标签上。一旦滑动(或敲击)切换到第一个以外的标签,滑动就不起作用。如果我再次点击第一个标签返回到开头,手势识别器将再次工作......一次。

如何让GestureListener在所有标签上都有效?

1 个答案:

答案 0 :(得分:0)

我想我应该意识到。 &#34; touch&#34;事件被定向到选项卡中的子视图,而不是传播到父和我在那里定义的GestureListener。我的第一个标签没有(但)有一个跨越屏幕的子视图,这就是它在那里工作的原因。