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

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

Спасибо,

Райан


person RyanCW    schedule 10.03.2014    source источник
comment
Вы пробовали scrollview.setScrollY(‹some_int›) во время onResume?   -  person Cory Roy    schedule 10.03.2014
comment
эй, приятель, спасибо за быстрый ответ, но я только что попробовал его в резюме: scrollView = (ScrollViewExtend)findViewById(R.id.merchantScroll); scrollView.setScrollY(400); ... не повезло : (единственный способ, который сработал для меня, - это onWindowFocusChanged, но это только тогда, когда представление отображается пользователю, поэтому вы можете видеть прокрутку до этой определенной позиции.   -  person RyanCW    schedule 10.03.2014


Ответы (6)


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

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
person Philipp Jahoda    schedule 10.03.2014
comment
эй, Филип, я только что попробовал, и у меня это не работает: ScrollView scrollView32 = (ScrollView)findViewById(R.id.merchantScroll); scrollView32.scrollTo(0,300); - person RyanCW; 10.03.2014
comment
Можете ли вы придумать другую причину, по которой он может не работать? У меня есть кнопка на экране, при нажатии на которую она перемещает scrollView в правильное положение (работает), но я не могу установить исходное положение (не работает) - person RyanCW; 10.03.2014
comment
Добавляете ли вы другие представления в прокрутку во время выполнения? Вы также можете попробовать отсрочить скорлинг, я покажу вам это на примере выше. - person Philipp Jahoda; 10.03.2014
comment
эй, Филипп, я действительно реализовал это, прежде чем смотреть на ваш ответ, и это работает: D, но это принятый ответ. - person RyanCW; 10.03.2014
comment
Может быть, это потому, что вы перемещаетесь, прежде чем добавить контент или информацию в список - person DarckBlezzer; 19.05.2016

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

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

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

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

person Vijay    schedule 19.10.2016
comment
Этот ответ работает почти нормально в большинстве ситуаций, за исключением запуска приложения, когда экран заблокирован. Использование onWindowFocusChanged более стабильно. См. stackoverflow.com/questions/10507976/< /а> - person Xavier.S; 31.05.2017

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

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

Очень некрасиво, но работает.

person Josef K.    schedule 06.01.2018

После нескольких часов поиска в Интернете

это сработало для меня:

ScrollView.post(new Runnable() {
@Override
public void run() {
//setting position here :
        ScrollView.scrollTo(X, Y);
    } 
});
person Amir194    schedule 25.05.2018

Проблема в том, что ScrollView не знает своего размера до того, как он будет выложен. Решение состоит в том, чтобы сохранить положение прокрутки до тех пор, пока не будет вызван onLayout, а затем установить положение прокрутки.

Вот пример (котлин):

class MyScrollView constructor(context: Context, attrs: AttributeSet) : ScrollView(context, attrs) {

    private var hasStartPositionBeenSet = false
    var startPosition = 0

    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
        super.onLayout(changed, l, t, r, b)

        if(!hasStartPositionBeenSet) {
             scrollTo(0, startPosition)
             hasStartPositionBeenSet = true
        }
    }
}

class MyActivity: Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        /* ... */
        findViewById<MyScrollView>(R.id.scrollView).startPosition = scrollPosition
    }
}
person Selti99    schedule 09.10.2018

person    schedule
comment
Я действительно думаю, что это НАСТОЯЩЕЕ решение, гордитесь и сделайте хорошее редактирование, по крайней мере, с пояснениями. И, пожалуйста, прочитайте документацию stackoverflow, потому что это не ответ. - person N0un; 26.09.2017