автоматическая прокрутка TextView в Android для отображения текста - PullRequest
46 голосов
/ 18 августа 2010

У меня есть TextView, к которому я динамически добавляю текст.

в моем файле main.xml У меня установлены свойства, чтобы сделать мои максимальные линии 19 и полосы прокрутки вертикальными.

в файле .java я использую textview.setMovementMethod(new ScrollingMovementMethod()); для прокрутки.

Прокрутка работает отлично.Как только 19 строк занято и добавлено больше строк, начинается прокрутка, как и должно быть.Проблема в том, что я хочу, чтобы новый текст прокручивался в поле зрения.

Я записываю значение для textview.getScrollY(), и оно остается на 0, несмотря ни на что (даже если я вручную прокручиваю его вниз и добавляюновая строка текста).

следовательно textview.scrollTo(0, textview.getScrollY()); ничего не делает для меня.

Есть ли другой метод, который я должен использовать для получения суммы вертикальной прокрутки для textview?Все, что я прочитал, говорит о том, что во всех отношениях все, что я делаю, должно работать: /

Ответы [ 12 ]

0 голосов
/ 13 ноября 2016

https://stackoverflow.com/a/7350267/4411645 у меня точно не сработало для

  1. getLayout может выдавать NPE, когда текст был недавно изменен.
  2. scrollTo должен быть изменен на scrollBy
  3. Он не учитывает относительную позицию просмотра текста или отступов.

Нет необходимости говорить, что это хорошая отправная точка. Вот мой вариант реализации в текстовом редакторе. При вычислении дельты мы должны вычесть вершину textView снизу, потому что getLineTop () также возвращает значение относительно вершины textView.

        @Override
        public void afterTextChanged(Editable editable) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    Layout layout = textView.getLayout();
                    if (layout != null) {
                        int lineTop = layout.getLineTop(textView.getLineCount());
                        final int scrollAmount = lineTop + textView.getPaddingTop()
                                + textView.getPaddingBottom() - textView.getBottom() + textView.getTop();
                        if (scrollAmount > 0) {
                            textView.scrollBy(0, scrollAmount);
                        } else {
                            textView.scrollTo(0, 0);
                        }
                    }
                }
            }, 1000L);
        }

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

0 голосов
/ 28 ноября 2013

чтобы избежать создания фиктивного scroolview я сделал

int top_scr,rec_text_scrollY;
top_scr=(int)rec_text.getTextSize()+rec_text.getHeight();
rec_text_scrollY=rec_text.getLineBounds(rec_text.getLineCount()-1, null)-top_scr;
    //repeat scroll here and in rec_text.post. 
    //If not scroll here text will be "jump up" after new append, and immediately scroll down
    //If not scroll in post, than scroll will not be actually processed
if(rec_text_scrollY>0)rec_text.scrollTo(0, rec_text_scrollY);
rec_text.post(new Runnable(){
    @Override
    public void run() {
        if(rec_text_scrollY>0)rec_text.scrollTo(0, rec_text_scrollY);
    }                   
});
...