ScrollView .scrollTo не работает?Сохранение позиции ScrollView при вращении - PullRequest
42 голосов
/ 16 июля 2010

Хорошо. Должно быть, я упускаю что-то очень простое здесь, но я думаю, что я пытаюсь сделать что-то довольно простое ... Просто сохраните положение полосы прокрутки ScrollView при изменении ориентации ...

Вот код для моих onSaveInstanceState и onRestoreInstanceState. sView - это контейнер для макета ScrollView. Внутри моего прокрутки есть линейный макет с большим количеством текстовых представлений.

    @Override 
public void onSaveInstanceState(Bundle outState) 
{
    //---save whatever you need to persist—

    outState.putInt("sViewX",sView.getScrollX());
    outState.putInt("sViewY",sView.getScrollY());

super.onSaveInstanceState(outState);

}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) 
{
    super.onRestoreInstanceState(savedInstanceState);

    sViewX = savedInstanceState.getInt("sViewX");   
    sViewY = savedInstanceState.getInt("sViewY");

    sView.scrollTo(sViewX, sViewY);

}

Если я установлю Toast со значениями sViewX и sViewY в Restore, значения сохранятся и будут правильными.

Редактировать: я только что попытался сделать sView.scrollTo (0,150); в моем onCreate .. просто чтобы увидеть, откроет ли это активность на 150px вниз, а это не так. Я думаю, что моя проблема связана с методом .scrollTo.

Ответы [ 6 ]

118 голосов
/ 16 июля 2010

Я понял это.

Поскольку я использую setText для TextViews в моем onCreate, вызов .scrollTo не будет работать.

Так что теперь я использую следующее:

sView.post(new Runnable() {
    @Override
    public void run() {
        sView.scrollTo(sViewX, sViewY);
    } 
});
1 голос
/ 08 сентября 2015

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

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    scrollView.scrollTo(.... 
1 голос
/ 16 марта 2015

Это работает для меня

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(SystemGlobal.SCROLL_Y, mRelativeLayoutMain.getTop());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
    mRelativeLayoutMain.scrollTo(0, savedInstanceState.getInt(SystemGlobal.SCROLL_Y));
}
1 голос
/ 06 февраля 2015

onRestoreInstanceState () просто для ранней прокрутки представления.Вот почему публикация новых Runnable помогает, но не всегда.Иногда даже нужно использовать postDelayed (), чтобы он работал.Для фрагмента вместо него можно использовать onViewCreated ():

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    sViewX = savedInstanceState.getInt("sViewX");   
    sViewY = savedInstanceState.getInt("sViewY");
    sView.scrollTo(sViewX, sViewY);
}
0 голосов
/ 27 января 2017

Вместо отправки действия прокрутки к следующему циклу выполнения, вы можете прокрутить представление в обратном вызове глобального макета:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    sView.getViewTreeObserver().addOnGlobalLayoutListener(
        new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                sView.scrollTo(sViewX, sViewY);
            }
        }
    );
}
0 голосов
/ 19 августа 2014

Для MVVMCross:

protected override void OnSaveInstanceState(Bundle outState)
{
    base.OnSaveInstanceState(outState);

    ScrollView sv = FindViewById<ScrollView>(Resource.Id.dispatchScrollView);
    int posY = sv.ScrollY;

    outState.PutInt("scrollY", posY);
}

protected override void OnRestoreInstanceState(Bundle savedInstanceState)
{
    base.OnRestoreInstanceState(savedInstanceState);

    ScrollView sv = FindViewById<ScrollView>(Resource.Id.dispatchScrollView);
    int posY = savedInstanceState.GetInt("scrollY");

    sv.Post(new Runnable(new Action(() => sv.ScrollTo(0, posY))));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...