Как я могу заставить TextView автоматически прокручивать, добавляя больше строк текста?

Итак, у меня есть TextView:

<TextView android:layout_width="fill_parent" android:layout_height="140.7dp" android:id="@+id/terminalOutput" android:layout_marginBottom="0.0dp" android:scrollbars="vertical" android:scrollbarAlwaysDrawVerticalTrack="true" android:maxLines="8" /> 

Я использую его как своего рода журнал выполнения, отображаемый пользователю, чтобы они могли отслеживать ход выполнения задачи, которая занимает около 3 минут. Однако, как только я перехожу через 8 строк, текст отключается. Это неинтуитивно для пользователя, потому что у них нет способа узнать, что он вышел из экрана, кроме ручного опроса, попробовав прокрутить вниз.

Как я могу сделать так, чтобы каждый раз, когда я добавляю какой-либо текст в этот TextView, я делаю его прокруткой вниз настолько низко, насколько это возможно?

Кроме того, это в Xamarin Android, но я не думаю, что это актуально. Это легко перевести между Java и Java

Solutions Collecting From Web of "Как я могу заставить TextView автоматически прокручивать, добавляя больше строк текста?"

В соответствии с ответом здесь Создание прокрутки TextView на Android

На самом деле вам не нужно использовать ScrollView.

Просто установите

android:maxLines = "AN_INTEGER"

Android: scrollbars = «вертикальные» свойства вашего TextView в XML-файле вашего макета.

Затем используйте:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

В вашем коде.

Это будет работать..

Из вашего кода необходимо сделать два шага:

Шаг 1

Хотя вы код в Xamarin Android, но, как и в Java в xxxActivity.java для terminalOutput invoke, должен быть таким

 TextView outputText = (TextView) findViewById(R.id.terminalOutput); outputText.setMovementMethod(new ScrollingMovementMethod()); 

Метод setMovementMethod () параметром ScrollingMovementMethod () – это трюк.

Шаг 2

А в макете, как и в Java-Android, также в activity_xxx.xml для декларации TextView, как указано выше, необходимо добавить это

 android:gravity="bottom" 

Когда вы добавляете новую строку в outputText, как это

 outputText.append("\n"+"New text line."); 

Он будет автоматически прокручиваться до последней строки, и это все волшебство для ваших нужд.

Вы можете попробовать 2 решения:

  1. Поместите TextView в ScrollView

     <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Your Text" > </TextView> </ScrollView> 
  2. Используйте специальный прокручиваемый TextView (тот же, что и обычный TextView, но он может прокручиваться)

     import android.content.Context; import android.graphics.Rect; import android.text.TextPaint; import android.util.AttributeSet; import android.view.animation.LinearInterpolator; import android.widget.Scroller; import android.widget.TextView; public class ScrollTextView extends TextView { // scrolling feature private Scroller mSlr; // milliseconds for a round of scrolling private int mRndDuration = 250; // the X offset when paused private int mXPaused = 0; // whether it's being paused private boolean mPaused = true; /* * constructor */ public ScrollTextView(Context context) { this(context, null); // customize the TextView setSingleLine(); setEllipsize(null); setVisibility(INVISIBLE); } /* * constructor */ public ScrollTextView(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.textViewStyle); // customize the TextView setSingleLine(); setEllipsize(null); setVisibility(INVISIBLE); } /* * constructor */ public ScrollTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // customize the TextView setSingleLine(); setEllipsize(null); setVisibility(INVISIBLE); } /** * begin to scroll the text from the original position */ public void startScroll() { // begin from the very right side mXPaused = -1 * getWidth(); // assume it's paused mPaused = true; resumeScroll(); } /** * resume the scroll from the pausing point */ public void resumeScroll() { if (!mPaused) return; // Do not know why it would not scroll sometimes // if setHorizontallyScrolling is called in constructor. setHorizontallyScrolling(true); // use LinearInterpolator for steady scrolling mSlr = new Scroller(this.getContext(), new LinearInterpolator()); setScroller(mSlr); int scrollingLen = calculateScrollingLen(); int distance = scrollingLen - (getWidth() + mXPaused); int duration = (new Double(mRndDuration * distance * 1.00000 / scrollingLen)).intValue(); setVisibility(VISIBLE); mSlr.startScroll(mXPaused, 0, distance, 0, duration); mPaused = false; } /** * calculate the scrolling length of the text in pixel * * @return the scrolling length in pixels */ private int calculateScrollingLen() { TextPaint tp = getPaint(); Rect rect = new Rect(); String strTxt = getText().toString(); tp.getTextBounds(strTxt, 0, strTxt.length(), rect); int scrollingLen = rect.width() + getWidth(); rect = null; return scrollingLen; } /** * pause scrolling the text */ public void pauseScroll() { if (null == mSlr) return; if (mPaused) return; mPaused = true; // abortAnimation sets the current X to be the final X, // and sets isFinished to be true // so current position shall be saved mXPaused = mSlr.getCurrX(); mSlr.abortAnimation(); } @Override /* * override the computeScroll to restart scrolling when finished so as that * the text is scrolled forever */ public void computeScroll() { super.computeScroll(); if (null == mSlr) return; if (mSlr.isFinished() && (!mPaused)) { this.startScroll(); } } public int getRndDuration() { return mRndDuration; } public void setRndDuration(int duration) { this.mRndDuration = duration; } public boolean isPaused() { return mPaused; } } 

Как использовать:

 ScrollTextView scrolltext = (ScrollTextView) findViewById(R.id.YourTextView); 

(Источник класса ScrollTextView: http://bear-polka.blogspot.com/2009/01/scrolltextview-scrolling-textview-for.html )

Был тот же вопрос. Пробовал несколько решений из этого и подобных обсуждений, ничего не получилось. Решила это так:

 edtConsoleText.setSelection(edtConsoleText.getText().length()); 

После каждого .append() .

От « Как прокрутить вниз в ScrollView при запуске активности »:

 final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview)); scrollview.post(new Runnable() { @Override public void run() { scrollview.fullScroll(ScrollView.FOCUS_DOWN); } }); 

Вам нужно будет поставить fullScroll() после операции добавления.

Я использую Xmarin.

Мое решение так много упоминалось, чтобы textView внутри ScrollView.

Если вы хотите увидеть новую строку в нижней части окна, используйте

 android:layout_gravity="bottom" 

Это удерживает новую строку внизу, пока вы не прокрутите представление. Вид остается там, где вы прокручиваете.

Код не нужен.

Однако, если вы хотите, чтобы содержимое всегда было внизу после добавления, вам нужно добавить код после append ():

 myText.Append(...); myscroll.FullScroll(FocusSearchDirection.Down); 

Ни один из этих ответов не был тем, чего я хотел, поэтому я придумал это.

 textView.append(log); while (textView.canScrollVertically(1)) { textView.scrollBy(0, 10); } 

Не забудьте установить метод перемещения перед прокруткой

 textView.setMovementMethod(new ScrollingMovementMethod()); 

Вы могли бы сделать что-то вроде:

 // When adding text mTextView.scrollTo(0, Integer.MAX_VALUE); 

Это должно привести к снижению, но также позволит пользователю прокручивать резервные копии, если они этого захотят.

Вам также необходимо автоматически определять, когда вы добавляете текст?