安卓嵌套ViewPager禁用触摸事件

3
在我的应用程序中,我有一个名为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忽略所有触摸事件/将它们传递给父视图呢?


在编程中,当你滑动父视图和子视图时,很难区分它们之间的差异。在你的代码中,当触摸到子视图时,你禁用了父视图的滑动功能。 - mdtuyen
你能找到解决方案吗?我遇到了同样的问题。 - theshadowchild
@theshadowchild 我做了!我已经在下面发布了答案。 - untitled
2个回答

7
答案其实很简单!
public class NonSwipeableViewPager extends ViewPager {

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

    }

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

} 

0

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

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

通过重写onInterceptTouchEvent(),我能够在活动中拦截触摸事件。然后我调用了ViewSwitcher中的onTouchEvent()来处理ListView的切换。最后通过返回false,确保ViewGroup不会消耗事件。
警告:使用此函数需要谨慎,因为它与View.onTouchEvent(MotionEvent)有相当复杂的交互,并且使用它需要以正确的方式实现该方法以及这个方法。
更多信息请参见: http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)

这个应该放在子ViewPager(在我的情况下是NonSwipeableViewPager)中吗?如果是的话,对我没有起作用。 - untitled

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接