以下は、スクロール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