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