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

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

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

пробовал mHorizScrollView.scrollTo(offsetX, 0); не работает. Я не знаю, что в этом плохого.

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

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

8 ответов


Я нашел, что если вы 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);

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

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


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

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


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


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


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