在我的Android应用程序中,我有一个使用视图寻呼机显示4个页面(片段)的活动 . 我通过调用在每个屏幕上实现了在页面之间移动的按钮:

pager.setCurrentItem(position, true);

视图寻呼机和片段都按我的意愿工作 . 然后我开始寻找一种解决方案来禁止用户在页面之间滑动,以便仅通过按钮处理页面之间的过渡 . 我找到的解决方案在一些stackoverflow文章以及This Blog中提到,它建议将视图寻呼机子类化以拦截触摸事件以禁用滑动 . 我通过子类化view pager类来遵循这些示例,如下所示:

public class ViewPager extends android.support.v4.view.ViewPager {

    private boolean enabled;

    public ViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onInterceptTouchEvent(event);
        }

        return false;
    }

    public void setSwipingEnabled(boolean enabled) {
        this.enabled = enabled;
    }

}

使用子类视图寻呼机并调用 setSwipingEnabled(false) 按预期工作 . 用户无法再使用滑动手势在页面之间移动,我仍然可以通过调用 setCurrentItem(int position, boolean smoothScroll) 按钮单击在页面之间移动 . 但是,使用子类会在页面之间中断动画 . 当我用android.support.v4.view.ViewPager调用 setCurrentItem(position, true) 时,我在页面之间滚动动画非常干净 . 当我使用子类进行相同的调用时,屏幕有一个非常简短的'flash'然后自动绘制新页面 .

我想知道如何修复动画,同时保留禁用用户在页面之间滑动的功能 . 我非常感谢任何帮助 . 如果您需要任何其他信息,请与我们联系 . 到目前为止,我已经使用运行2.3.5的三星设备和针对Android 2.3.3的AVD仿真器进行了测试 .

Update:

我已经尝试过几件事,希望我能幸运并找到解决方案 . 我查看了我正在扩展的 android.support.v4.view.ViewPager 的源代码,发现该实际滚动代码的"MOST"在 onTouchEvent(MotionEvent event) 方法中 . 我尝试使用普通的视图寻呼机并调用下面的消息来代替子类化它:

pager.setOnTouchListener(new View.onTouchListener() {
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return true;
    }
});

这样做部分有效 . 它可以防止滑动触发滚动到下一个视图 . 但是,在将触摸事件传递给 onTouchEvent() 方法之前,android.support.v4.view.ViewPager中的 onInterceptTouchEvent(MotionEvent event) 方法会执行小滚动作为拦截的一部分 . 没有子类化ViewPager,我没有看到任何改变这种行为的方法 .