以下是一个真正的工作解决方案,只要可以滚动,它将滚动WebView的水平滑动。如果WebView无法进一步滚动,则ViewPager将使用下一个横向扫描来切换页面。
扩展WebView
利用API-Level 14(ICS),View方法可以引入横向()方法,我们需要解决这个问题。如果您只开发ICS或以上版本,您可以直接使用此方法并跳到下一节。否则我们需要自己实现这个方法,使解决方案在ICS之前也起作用。
要做到这一点,只需从WebView派生你自己的类:
public class ExtendedWebView extends WebView {
public ExtendedWebView(Context context) {
super(context);
}
public ExtendedWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public boolean canScrollHor(int direction) {
final int offset = computeHorizontalScrollOffset();
final int range = computeHorizontalScrollRange() - computeHorizontalScrollExtent();
if (range == 0) return false;
if (direction < 0) {
return offset > 0;
} else {
return offset < range - 1;
}
}
}
重要提示:请记住在布局文件中引用您的ExtendedWebView,而不是标准WebView。
扩展ViewPager
现在您需要扩展ViewPager来正确处理水平滑动。无论您是否使用ICS,都需要做任何事情:
public class WebViewPager extends ViewPager {
public WebViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if (v instanceof ExtendedWebView) {
return ((ExtendedWebView) v).canScrollHor(-dx);
} else {
return super.canScroll(v, checkV, dx, x, y);
}
}
}
重要提示:请记住在您的布局文件中引用您的WebViewPager,而不是标准的ViewPager。
而已!
更新2012/07/08:我最近注意到,使用ViewPager的“当前”实现时,上面显示的内容似乎不再需要。 “当前”实现似乎在捕获自己的滚动事件之前正确检查子视图(请参阅ViewPager here的canScroll方法)。不完全知道,当实现被改变以正确处理时 – 我仍然需要Android Gingerbread(2.3.x)和之前的代码。