Android嵌套ViewPager禁用触摸事件

时间:2015-12-02 04:19:21

标签: android android-fragments android-viewpager android-view

在我的应用中,我有ViewPager。在其中一个页面中,我有另一个ViewPager,其中我通过自定义ViewPager实施禁用了滑动手势:

public class NonSwipeableViewPager extends ViewPager {

    public NonSwipeableViewPager(Context context) {
        super(context);
    }

    public NonSwipeableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }
}

效果很好;子ViewPager中的滑动手势被禁用。但是,除非从屏幕的最边缘开始滑动,否则无法刷新父ViewPager。如何让孩子ViewPager忽略所有触摸事件/将它们传递给父视图?

2 个答案:

答案 0 :(得分:4)

答案结果很简单!

public class NonSwipeableViewPager extends ViewPager {

    public NonSwipeableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    @Override
    public boolean canScrollHorizontally(int direction) {
        return false;
    }

} 

答案 1 :(得分:0)

那个解决方案适合我,你呢?由于我的ViewSwitcher没有检测到触摸事件,我拦截了触摸事件,称为onTouchEvent()并返回false。这里:

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    onTouchEvent(ev);
    return false; 
}

通过覆盖onInterceptTouchEvent(),我能够拦截活动中的触摸事件。然后我调用ViewSwitcher中的onTouchEvent()来处理ListViews的切换。最后,通过返回false,可以确保ViewGroup不会使用该事件。

警告:使用此函数需要注意,因为它与View.onTouchEvent(MotionEvent)的交互相当复杂,并且使用它需要以正确的方式实现该方法以及此方法

更多信息: http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)