Подтвердить что ты не робот

Как я могу сделать 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

4b9b3361

Ответ 1

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

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

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

android:maxLines = "AN_INTEGER"

android: scrollbars = "vertical" свойства вашего TextView в вашем XML файле макета.

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

yourTextView.setMovementMethod(new ScrollingMovementMethod());

в вашем коде.

Это сработает.

Ответ 2

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

Шаг 1

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

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

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

  

Ответ 3

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

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

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

Ответ 4

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

  • Поместите 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>
    
  • Используйте специальный прокручиваемый 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 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 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)

Ответ 6

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

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

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

android:layout_gravity="bottom"

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

Не требуется код.

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

myText.Append(...);

myscroll.FullScroll(FocusSearchDirection.Down);

Ответ 7

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

textView.append(log);

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

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

textView.setMovementMethod(new ScrollingMovementMethod());

Ответ 8

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

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

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

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