Итак, я знаю, что этот вопрос довольно старый, но у меня есть решение, которое, я думаю, имеет некоторые дополнительные преимущества по сравнению с тем, которое было здесь опубликовано. Одна из ситуаций, которая может произойти, заключается в том, что внутри моего ViewPager (что я делаю) может быть более одного HorizontalScrollView, а затем мне потребуется предоставить тонны идентификаторов ViewPager, чтобы он всегда мог проверять наличие дочерних конфликтов касания.
Я проанализировал источник из ViewPager и обнаружил, что они используют этот метод, называемый canScroll, чтобы определить, можно ли прокрутить дочернее представление. К счастью, он не был статичным или окончательным, поэтому я мог просто переопределить его. Внутри этого метода был вызван «логический ViewCompat.canScrollHorizontally (View, int)» (тот, который всегда возвращает false для SDK <14). Мое решение тогда было: </p>
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomViewPager(Context context) {
super(context);
}
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
return super.canScroll(v, checkV, dx, x, y) || (checkV && customCanScroll(v));
}
protected boolean customCanScroll(View v) {
if (v instanceof HorizontalScrollView) {
View hsvChild = ((HorizontalScrollView) v).getChildAt(0);
if (hsvChild.getWidth() > v.getWidth())
return true;
}
return false;
}
}
Итак, если у вас есть другой класс View внутри вашего ViewPager, который также должен получать горизонтальные перетаскивания, просто измените customCanScroll (View), чтобы вы могли вернуться, если касание не должно быть перехвачено или нет.
Логическое checkV истинно, если текущее представление также должно быть проверено на «прокручиваемость», поэтому мы должны также проверить это.
Надеюсь, что это поможет в будущем решить подобные проблемы (или, если есть лучшее решение или официальное решение на платформе Android, дайте мне знать).