以下是一个真正的工作解决方案,WebView
只要它可以滚动,它就会在水平滑动时滚动。如果WebView
无法进一步滚动,则下一次水平滑动将被ViewPager
用于切换页面。
扩展WebView
API-Level 14 (ICS) 引入了该View
方法canScrollHorizontally()
,我们需要解决这个问题。如果你只为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
. “当前”实现似乎在自己捕获滚动事件之前正确检查了子视图(请参阅此处canScroll
的方法)。不确切知道,何时更改实现以正确处理此问题 - 我仍然需要 Android Gingerbread (2.3.x) 及之前的代码。ViewPager