Im Folgenden wird eine funktionierende Lösung vorgestellt, die die WebView
bei einer horizontalen Wischbewegung so lange, wie es scrollen kann. Wenn die WebView
nicht weiter scrollen kann, wird die nächste horizontale Wischbewegung von der ViewPager
um die Seite zu wechseln.
Ausweitung der WebView
Mit API-Level 14 (ICS) wird die View
Methode canScrollHorizontally()
eingeführt, die wir brauchen, um das Problem zu lösen. Wenn Sie nur für ICS oder höher entwickeln, können Sie diese Methode direkt verwenden und zum nächsten Abschnitt übergehen. Andernfalls müssen wir diese Methode selbst implementieren, damit die Lösung auch auf pre-ICS funktioniert.
Leiten Sie dazu einfach Ihre eigene Klasse von 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;
}
}
}
Das ist wichtig: Denken Sie daran, auf Ihre ExtendedWebView
innerhalb Ihrer Layoutdatei anstelle der Standard WebView
.
Ausweitung der ViewPager
Nun müssen Sie die ViewPager
um horizontale Wischbewegungen korrekt zu behandeln. Dies muss in jedem Fall geschehen - unabhängig davon, ob Sie ICS verwenden oder nicht:
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);
}
}
}
Das ist wichtig: Denken Sie daran, auf Ihre WebViewPager
innerhalb Ihrer Layoutdatei anstelle der Standard ViewPager
.
Das war's!
Update 2012/07/08: Ich habe kürzlich festgestellt, dass die oben gezeigten Dinge nicht mehr erforderlich zu sein scheinen, wenn man die "aktuelle" Implementierung des ViewPager
. Die "aktuelle" Implementierung scheint die Unteransichten korrekt zu prüfen, bevor sie das Bildlaufereignis selbst erfasst (siehe canScroll
Methode der ViewPager
ici ). Ich weiß nicht genau, wann die Implementierung geändert wurde, um dies korrekt zu handhaben - ich brauche immer noch den obigen Code auf Android Gingerbread (2.3.x) und davor.