Ниже приведено реальное рабочее решение, которое будет прокручивать WebView
по горизонтали, пока оно может прокручиваться. Если WebView
не может продолжить прокрутку, следующий горизонтальный удар будет использован ViewPager
для переключения страницы.
Расширение WebView
В API-уровне 14 (ICS) был введен метод View
canScrollHorizontally()
, который нам необходим для решения проблемы. Если вы разрабатываете только для ICS или выше, вы можете напрямую использовать этот метод и перейти к следующему разделу. В противном случае нам нужно реализовать этот метод самостоятельно, чтобы решение работало и на pre-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
метод ViewPager
здесь ). Не знаю точно, когда реализация была изменена для правильной обработки - мне все еще нужен код выше для Android Gingerbread (2.3.x) и ранее.