Подтвердить что ты не робот

Как программно прокрутить HorizontalScrollView

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

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

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

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

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

4b9b3361

Ответ 1

Я обнаружил, что если вы 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: Для прокрутки для начала или конца вы можете использовать:

this.fullScroll(HorizontalScrollView.FOCUS_RIGHT/FOCUS_LEFT);

вместо

this.scrollTo(wherever, 0);

Ответ 2

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);
    }

Ответ 3

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

Ответ 4

Лучшим подходом будет использование 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
      }
    });
  }
}

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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