如何拦截ViewPager.OnPageChangeListener的触摸事件

6
我将尝试禁止ViewPager在选项卡之间滚动。我的情况如下:
        public class MyClass extends ViewPager implements ViewPager.OnPageChangeListener, OnTouchListener {

             public MyClass() {
               setOnTouchListener(this);
             }

@Override
    public void onPageScrollStateChanged(int state) {
        Log.d("Testing", TAG + " onPageScrollStateChanged");
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        Log.d("Testing", TAG + " onPageScrolled");
    }

    @Override
    public void onPageSelected(int position) {
        Log.d("Testing", TAG + " onPageSelected");
    }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            Log.d("Testing", "intercept");
                return false;
        }

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d("Testing", "touch2");
                    return false;
            }

        }

我已经记录了onPageScrolled和onPageScrollStateChanged的日志,但是我没有记录onInterceptTouchEvent和onTouch的日志。 我做错了什么?

3个回答

12

这是我处理这个问题的方法(整个班级):

public class SelectiveViewPager extends ViewPager {
private boolean paging = true;

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

public SelectiveViewPager(Context context, AttributeSet attributeSet){
    super(context, attributeSet);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
    if (paging) {
        return super.onInterceptTouchEvent(e);
    }

    return false;
}

public void setPaging(boolean p){ paging = p; }

}

如果需要,布尔值paging可以让你选择打开或关闭分页选项。如果不需要,只需return false。如果在onTouch中没有特别的操作,那么不需要覆盖它。


是的,这可能有效...但不同之处在于我的类实现了ViewPager.OnPageChangeListener。我认为这是问题所在,因为onPageScrollStateChanged、onPageScrolled和onPageSelected可能使用touchEvent,因此所有被应用程序捕获的touchEvent都会传递到这些方法中。你对此有什么看法? - Felipe Mosso

1
在你的onInterceptTouchEvent();中,return true;

这不是问题,因为我甚至无法从这个方法中捕获日志。 - Felipe Mosso

0

你的构造函数没有被调用,顺便问一下,你是通过代码创建还是通过xml填充来创建view pager的?你需要定义正确的构造函数。


我正在创建我的视图页,通过XML进行膨胀。这是我的类的简化版本。但是OnPageChangeListener中的方法正常运行。 - Felipe Mosso
那个类甚至无法编译。我的观点是,构造函数必须根据您实例化自定义视图的方式进行适当定义。无论如何,这可能取决于视图层次结构,例如,是否有任何视图/视图组可以更早地拦截触摸事件? - gwvatieri

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