Android: ScrollView заставляет снизу - PullRequest
162 голосов
/ 20 июня 2010

Я бы хотел, чтобы ScrollView запускался полностью внизу.Любые методы?

Ответы [ 13 ]

311 голосов
/ 24 декабря 2010

вы должны запустить код внутри scroll.post так:

scroll.post(new Runnable() {            
    @Override
    public void run() {
           scroll.fullScroll(View.FOCUS_DOWN);              
    }
});
222 голосов
/ 20 июня 2010

scroll.fullScroll(View.FOCUS_DOWN) также должно работать.

60 голосов
/ 19 января 2016

scroll.fullScroll(View.FOCUS_DOWN) приведет к смене фокуса.Это приведет к некоторому странному поведению при наличии нескольких фокусируемых видов, например двух EditText.Есть другой способ для этого вопроса.

    View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1);
    int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom();
    int sy = scrollLayout.getScrollY();
    int sh = scrollLayout.getHeight();
    int delta = bottom - (sy + sh);

    scrollLayout.smoothScrollBy(0, delta);

Это хорошо работает.

Расширение Kotlin

fun ScrollView.scrollToBottom() {
    val lastChild = getChildAt(childCount - 1)
    val bottom = lastChild.bottom + paddingBottom
    val delta = bottom - (scrollY+ height)        
    smoothScrollBy(0, delta)
}
36 голосов
/ 26 июля 2016

Иногда scrollView.post не работает

 scrollView.post(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

НО, если вы используете scrollView.postDelayed, он точно будет работать

 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);
35 голосов
/ 27 февраля 2014

Лучше всего для меня это

scroll_view.post(new Runnable() {
     @Override
     public void run() {
         // This method works but animates the scrolling 
         // which looks weird on first load
         // scroll_view.fullScroll(View.FOCUS_DOWN);

         // This method works even better because there are no animations.
         scroll_view.scrollTo(0, scroll_view.getBottom());
     }
});
28 голосов
/ 07 января 2012

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

    private void sendScroll(){
        final Handler handler = new Handler();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {Thread.sleep(100);} catch (InterruptedException e) {}
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        scrollView.fullScroll(View.FOCUS_DOWN);
                    }
                });
            }
        }).start();
    }

Примечание

Этот ответ - обходной путь для действительно старых версий Android.Сегодня в postDelayed больше нет этой ошибки, и вы должны ее использовать.

3 голосов
/ 10 сентября 2013

Одна вещь, которую следует учитывать, это то, что НЕ нужно устанавливать.Убедитесь, что ваши дочерние элементы управления, особенно элементы управления EditText, не имеют свойства RequestFocus.Это может быть одним из последних интерпретируемых свойств макета, и он будет переопределять параметры гравитации для своих родителей (макет или ScrollView).

3 голосов
/ 10 мая 2012

Когда вид еще не загружен, вы не можете прокручивать.Вы можете сделать это «позже» с помощью поста или вызова в спящем режиме, как указано выше, но это не очень элегантно.

Лучше спланировать прокрутку и сделать это в следующем onLayout ().Пример кода здесь:

https://stackoverflow.com/a/10209457/1310343

1 голос
/ 03 апреля 2019

Вот некоторые другие способы прокрутки вниз

fun ScrollView.scrollToBottom() {
    // use this for scroll immediately
    scrollTo(0, this.getChildAt(0).height) 

    // or this for smooth scroll
    //smoothScrollBy(0, this.getChildAt(0).height)

    // or this for **very** smooth scroll
    //ObjectAnimator.ofInt(this, "scrollY", this.getChildAt(0).height).setDuration(2000).start()
}

Использование

Если вы уже выложили скролл

my_scroll_view.scrollToBottom()

ваше прокручиваемое представление не закончено (например: вы прокручиваете до конца в Activity onCreate method ...)

my_scroll_view.post { 
   my_scroll_view.scrollToBottom()          
}
1 голос
/ 08 января 2019

Я действительно обнаружил, что двойной вызов fullScroll помогает:

myScrollView.fullScroll(View.FOCUS_DOWN);

myScrollView.post(new Runnable() {
    @Override
    public void run() {
        myScrollView.fullScroll(View.FOCUS_DOWN);
    }
});

Это может быть связано с активацией метода post () сразу после выполнения первой (неудачной) прокрутки. Я думаю, что это происходит после любого предыдущего вызова метода в myScrollView, поэтому вы можете попробовать заменить первый метод fullScroll () на что-либо еще, что может быть вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...