Як прокрутити донизу в 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
Palo

4
Замість публікації () використовуйте 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
Найкраща відповідь на це питання поки що. Багато інших підходів є умовними, але цей чудовий, і він працює надзвичайно добре
Рана,

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);
       }
    });

3

Відразу після додавання даних до подання додайте цей рядок:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

Після ініціалізації компонента UI та заповнення його даними. додайте ці рядки до вашого методу on create

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);
                }
            });
        }
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.