Как установить начальную позицию ScrollView?

Я пытаюсь установить начальную позицию прокрутки View, но не нашел способ. У кого-нибудь есть идеи? Также у меня есть фрагмент GoogleMaps как дочерний элемент прокрутки.

Спасибо,

Райан

Ответ 1

Да, это возможно:

ScrollView.scrollTo(int x, int y);
ScrollView.smoothScrollTo(int x, int y);
ScrollView.smoothScrollBy(int x, int y);

можно использовать для этого. Параметры x и y представляют собой координаты для прокрутки по горизонтальной и вертикальной оси.

Пример в коде:

    @Override   
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
        sv.scrollTo(0, 100);
     }

В этом примере, после запуска Activity, ваш ScrollView будет прокручиваться на 100 пикселей.

Вы также можете попробовать задержать процесс прокрутки:

final ScrollView sv = (ScrollView) findViewById(R.id.scrollView);

Handler h = new Handler();

h.postDelayed(new Runnable() {

    @Override
    public void run() {
        sv.scrollTo(0, 100);            
    }
}, 250); // 250 ms delay

Ответ 2

Принятый ответ не работает для меня. Прямого способа установки начального положения прокрутки нет.

Однако вы можете установить начальную позицию перед рисованием прокрутки, например:

rootView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {
        scrollView.getViewTreeObserver().removeOnPreDrawListener(this);
        scrollView.setScrollY(100);
        return false;
    }
});

Вы также можете использовать scrollView.setScrollY(100) внутри Handler, но при прокрутке это будет отрываться.

Ответ 3

Scrollview sw = (ScrollView) findViewById(R.id.scrollView);
sw.post(new Runnable() {
     public void run() {
           sw.smoothScrollTo(0, 5000);
     }
});

Ответ 4

Ни один из ответов не работал у меня. Мой ScrollView является частью окружения LinearLayout. Я поместил настройку ScrollView в метод onDraw() этого LinearLayout следующим образом:

@Override
protected void onDraw(Canvas canvas){
    if(scrollAdjustTries > 2){
        return;
    }
    scrollAdjustTries++;
    mScrollView.scrollTo(0, mModel.scrollLine());
}

Очень уродливый, но работающий.