Android: сила прокрутки в нижней части экрана

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

Ответ 1

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

Поместите это в scroll.Post(Runnable run)

Код Котлина

scrollView.post {
   scrollView.fullScroll(View.FOCUS_DOWN)
}

Ответ 2

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

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

Ответ 3

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

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

Удлинение Котлина

fun ScrollView.scrollToBottom() {
    val lastChild = getChildAt(childCount - 1)
    val bottom = lastChild.bottom + paddingBottom
    val delta = bottom - (scrollY+ height)        
    smoothScrollBy(0, delta)
}

Ответ 4

Иногда 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);

Ответ 5

Что лучше всего для меня было

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

Ответ 6

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

    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 больше не имеет этой ошибки, и вы должны использовать ее.

Ответ 7

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

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

fooobar.com/questions/51881/...

Ответ 8

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

Ответ 9

Не совсем ответ на вопрос, но мне нужно было прокрутить вниз, как только EditText получил фокус. Однако принятый ответ заставил бы ET также сразу же потерять фокус (к ScrollView я предполагаю).

Мое обходное решение было следующим:

emailEt.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus){
            Toast.makeText(getActivity(), "got the focus", Toast.LENGTH_LONG).show();
            scrollView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(ScrollView.FOCUS_DOWN);
                }
            }, 200);
        }else {
            Toast.makeText(getActivity(), "lost the focus", Toast.LENGTH_LONG).show();
        }
    }
});

Ответ 10

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

myScrollView.fullScroll(View.FOCUS_DOWN);

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

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

Ответ 11

Вот еще несколько способов прокрутки вниз

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...)

my_scroll_view.post { 
   my_scroll_view.scrollToBottom()          
}

Ответ 12

Использование есть еще один крутой способ сделать это с сопрограммами Kotlin. Преимущество использования сопрограммы по сравнению с обработчиком с работоспособным (post/postDelayed) состоит в том, что он не запускает дорогой поток для выполнения отложенного действия.

launch(UI){
    delay(300)
    scrollView.fullScroll(View.FOCUS_DOWN)
}

Важно указать сопрограмму HandlerContext в качестве пользовательского интерфейса, в противном случае отложенное действие не может быть вызвано из потока пользовательского интерфейса.

Ответ 13

В этих случаях использовалось только scroll.scrollTo(0, sc.getBottom()) не работают, используйте его с помощью scroll.post

Пример:

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