Как прокручивать вниз в ScrollView при запуске активности

96

Я показываю некоторые данные в ScrollView. При запуске активности (метод onCreate) я заполняю ScrollView данными и хочу прокрутить вниз.

Я пробовал использовать getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Это работает, когда я делаю это как действие при нажатии кнопки, но не работает в методе onCreate.

Есть ли способ прокрутить ScrollView вниз при запуске активности? Это означает, что представление уже прокручено вниз при первом отображении.

Пало
источник
Это также объясняет, почему я все время получал 0, когда пытался использовать getMeasuredWidth при инициализации моего собственного подкласса ScrollView.
Ghoti

Ответы:

218

Это нужно сделать следующим образом:

    getScrollView().post(new Runnable() {

        @Override
        public void run() {
            getScrollView().fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

Таким образом, представление сначала обновляется, а затем прокручивается до «нового» дна.

Пало
источник
1
Я пытаюсь именно это, но, похоже, все еще не работает ... вы вызываете приведенный выше код в onCreateконтейнере Activity?
pstanton
Я делаю это в onStart
Пало
4
Вместо этого post () используйте postDelayed () с задержкой 100 мс. он будет работать с любой точки жизненного цикла деятельности.
Виталий А
50

После добавления данных поместите следующий код:

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});
Харшид
источник
4
Для меня это работало только с postDelayed вместо post. Всего 100 миллисекунд задержки.
Андреас Рудольф
Отлично. Конечно, с помощью комбо с scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra
30

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

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});
Сонида
источник
2
Лучший ответ на этот вопрос на данный момент. Множество других подходов условны, но этот потрясающий и отлично работает :)
rana
17

Вы можете сделать это в файле макета:

                android:id="@+id/listViewContent"
                android:layout_width="wrap_content"
                android:layout_height="381dp" 
                android:stackFromBottom="true"
                android:transcriptMode="alwaysScroll">
Там Дао
источник
8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);
Маквин
источник
4

Попробуй это

    final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
    scrollview.post(new Runnable() {
       @Override
       public void run() {
         scrollview.fullScroll(ScrollView.FOCUS_DOWN);
       }
    });
FOO
источник
3

Сразу после добавления данных в представление добавьте одну строку:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);
ЛЕМУЭЛЬ АДАН
источник
1

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

Runnable runnable=new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    };
    scrollView.post(runnable);
Рамзи Хассан
источник
1

Это лучший способ сделать это.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
рана
источник