在我的Android应用程序中,我有一个使用视图寻呼机显示4个以上页面(片段)的活动。我通过调用:
在每个屏幕上实现了在页面之间移动的按钮pager.setCurrentItem(position, true);
视图寻呼机和片段都按我的意愿工作。然后我开始寻找一种解决方案来禁止用户在页面之间滑动,以便仅通过按钮处理页面之间的过渡。我找到的解决方案在一些stackoverflow文章以及This Blog中提到,它建议将视图寻呼机子类化以拦截触摸事件以禁用滑动。我通过继承视图分页器类来跟踪这些示例,如下所示:
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)
时,我会在页面之间滚动动画。当我使用子类进行相同的调用时,屏幕会有一个非常短暂的“闪烁”,然后自动绘制新页面。
我想知道如何修复动画,同时保留禁用用户在页面之间滑动的功能。我非常感谢任何帮助。如果您需要任何其他信息,请与我们联系。到目前为止,我已经使用运行2.3.5的三星设备和针对Android 2.3.3的AVD仿真器进行了测试。
更新
我尝试了几件事,希望我能幸运并找到解决方案。我查看了我正在扩展的android.support.v4.view.ViewPager
的源代码,发现该实际滚动代码的“MOST”在onTouchEvent(MotionEvent event)
方法中。我尝试使用普通的视图寻呼机并调用下面的消息来使用触摸事件,而不是继承它:
pager.setOnTouchListener(new View.onTouchListener() {
@Override
public boolean onTouchEvent(MotionEvent event) {
return true;
}
});
这样做部分有效。它可以防止滑动触发滚动到下一个视图。但是,在将触摸事件传递给onInterceptTouchEvent(MotionEvent event)
方法之前,android.support.v4.view.ViewPager中的onTouchEvent()
方法会执行小滚动作为拦截的一部分。没有子类化ViewPager,我没有看到任何改变这种行为的方法。