Как программно прокрутить HorizontalScrollView - PullRequest
21 голосов
/ 26 января 2011

У меня есть HorizontalScrollView, который содержит RelativeLayout.Этот макет является пустым в XML и заполняется из java в onCreate.

Я бы хотел, чтобы этот вид прокрутки изначально находился где-то посередине RelativeLayout, что намного больше экрана.

Я пытался mHorizScrollView.scrollTo(offsetX, 0);, который не работает.Я не знаю, что с этим не так.

Я мог бы опубликовать код, но это не очень важно.Важно то, что все сделано программно (должно: s), и что начальная позиция HorizontalScrollView должна быть установлена ​​программно.

Спасибо за чтение.Пожалуйста, скажите мне, если вам нужно больше деталей или если это не достаточно ясно.

Ответы [ 8 ]

26 голосов
/ 01 марта 2012

Я обнаружил, что если вы extend HorizontalScrollView и переопределите onLayout, вы можете аккуратно прокрутить после супер звонка onLayout:

MyScrollView extends HorizontalScrollView {
    protected void onLayout (boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        this.scrollTo(wherever, 0);
    }
}

EDIT: Для прокрутки до start или end вы можете использовать:

this.fullScroll(HorizontalScrollView.FOCUS_RIGHT/FOCUS_LEFT);

вместо

this.scrollTo(wherever, 0);
24 голосов
/ 21 июня 2013
public void autoSmoothScroll() {

        final HorizontalScrollView hsv = (HorizontalScrollView) view.findViewById(R.id.horiscroll);
        hsv.postDelayed(new Runnable() {
            @Override
            public void run() {
                //hsv.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
                hsv.smoothScrollBy(500, 0);
            }
        },100);
    }
16 голосов
/ 26 января 2011

Чтобы проверить, является ли это проблемой синхронизации (что, я думаю, так), вместо вызова scrollTo () в onStart, вызовите postDelayed () с Runnable, вызывающим scrollTo, с задержкой 30 или около того.

9 голосов
/ 15 августа 2011

Лучшим подходом будет использование ViewTreeObserver для наблюдения за раскладками.

View interestedInView;
onCreate(){
  //Code

  //Observe for a layout change
  ViewTreeObserver viewTreeObserver = interestedInView.getViewTreeObserver();
  if (viewTreeObserver.isAlive()) {
    viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        //REMOVE THE VIEWTREE OBSERVER
        //interestedInView is ready for size and position queries because it has been laid out
      }
    });
  }
}
1 голос
/ 25 мая 2011

Используйте view.post и напишите scrollTo (x, y) внутри метода run.Это способ сделать недействительным представление в методе post согласно документу API Android.

1 голос
/ 11 мая 2011

Проблема в том, что представление еще не имеет размера. Чистый способ сделать это - реализовать onSizeChanged из ScrollView, чтобы отправить сообщение обработчику в вашей активности, чтобы уведомить активность о том, что представление имеет размер и что прокрутка возможна.

0 голосов
/ 13 мая 2011

Функция onSizeChanged должна работать.Что вы не понимаете, так это то, что onSizeChanged должен отправлять сообщение обработчику вашей активности, а не какой-либо функции обратного вызова, потому что обработчик выполнит код в потоке пользовательского интерфейса.Вы не можете выполнять операции пользовательского интерфейса вне его.Посмотрите на обработчики.

0 голосов
/ 26 января 2011

Функция scrollTo должна работать.Что такое layout_width HSV и вид из него?

...