Android – просмотр прокрутки ViewPager

Я использую ViewPager в своем приложении, в котором размещается горизонтальная компоновка изображений для реализации Paginated gallery.

Когда я тестирую только просмотр, т. Е. Как основной вид активности, он отлично работает. Однако, когда я включаю это как часть другого макета, прокрутка (или щелчок) становится странной. Если кажется, что он возвращается в исходное положение примерно на полпути через салфетки (действительно быстрые щелчки – единственное, что я до сих пор работаю).

Есть идеи, что может быть проблемой?

На всякий случай это имеет какое-либо значение, представление завышено от XML и добавлено в унаследованный класс PagerAdapter .

Да, ViewPager и другие элементы прокрутки по умолчанию не работают хорошо. Когда мне приходится делать такие вещи, я обычно подклассифицирую ViewPager чтобы сделать что-то, что известно о детях, которые могут прокручиваться. Затем в моем onInterceptTouchEvent() я проверяю, находится ли onInterceptTouchEvent() удар в этом дочернем onInterceptTouchEvent() и не перехватывает событие касания, чтобы у ребенка был удар. Что-то вроде этого:

 /** * Override to not intercept touch events within our scroller if it exists. */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if(scrollerId != 0) { View scroller = findViewById(scrollerId); if(scroller != null) { Rect rect = new Rect(); scroller.getHitRect(rect); if(rect.contains((int)ev.getX(), (int)ev.getY())) { return false; } } } return super.onInterceptTouchEvent(ev); } 

Тогда вам нужно всего лишь установить этот scrollerId (работает простой публичный метод).

Обратите внимание, что если вы используете ScrollView для элементов с вертикальной прокруткой с детьми ViewPager , вам нужно идти в другом направлении. Имейте подкласс ScrollView который определяет направления вертикальной прокрутки и поруки для горизонтальной прокрутки, поэтому ViewPager выбирает его.

 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = yDistance = 0f; lastX = ev.getX(); lastY = ev.getY(); break; case MotionEvent.ACTION_MOVE: final float curX = ev.getX(); final float curY = ev.getY(); xDistance += Math.abs(curX - lastX); yDistance += Math.abs(curY - lastY); lastX = curX; lastY = curY; if (xDistance > yDistance) return false; } return super.onInterceptTouchEvent(ev); } 
Intereting Posts
Почему Environment.getExternalStoragePublicDirectory не работает на некоторых устройствах (специально выпущенных с начала 2011 года)? ORMLite и добавление существующего сохраняемого объекта в зарубежную коллекцию полей Как добавить два цвета в панель выполнения в Android? ViewPager.setCurrentItem работает только с w / smoothScroll, установленным в true <Ваше приложение> имеет проблемы с сервисами Google Play. При использовании GoogleApiClient он всегда запускается onConnectionFailed Фильтрация ресурсов из монолитного сервиса Play Services, чтобы уменьшить APK Как найти количество видимых элементов списка в поисковом фильме jQuery mobile Обновить пользовательский интерфейс из потока Android: уменьшите ширину раскрывающегося окна счетчика Наклоните изображение на титтинг под любым углом Обновить полилинию в соответствии с движением пользователя android googleMaps v2 Как создать массив объектов с помощью Loop в Android Щелчок по списку не работает с флажками Android Могу ли я разрабатывать Android на Mac? Откройте еще одну активность на Android с помощью кнопки