Comment puis-je faire défiler automatiquement une fenêtre TextView au fur et à mesure que j'ajoute d'autres lignes de texte?

Donc, j'ai un TextView comme suit:

<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" />

je l'utilise comme une sorte de journal en cours d'exécution, affiché à l'utilisateur afin qu'ils puissent suivre les progrès d'une tâche qui prend environ 3 minutes. Cependant, une fois que j'ai dépassé 8 lignes, le texte sort de l'écran. Cela est peu intuitif pour l'utilisateur parce qu'ils n'ont aucun moyen de savoir que cela s'est éteint de l'écran, autre que de sonder manuellement en essayant de faire défiler vers le bas.

Comment puis-je faire en sorte que chaque fois que j'ajoute du texte à ce TextView je le fasse défiler aussi bas que possible?

aussi, c'est dans Xamarin Android, mais je ne pense pas que ce soit pertinent. Il est facile de traduire entre lui et Java

26
demandé sur Earlz 2013-11-07 06:07:34

8 réponses

selon la réponse ici Faire TextView Défilement Android

Vous n'avez pas besoin d'utiliser un ScrollView en fait.

il suffit de régler l'

android:maxLines = "AN_INTEGER"

android: scrollbars = " vertical" propriétés de votre TextView dans le fichier xml de votre mise en page.

puis utiliser:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

dans votre code.

ça va marcher..

32
répondu DarwinLouis 2017-05-23 12:18:17

à Partir de votre Code, deux étapes ont à faire:

Etape 1

bien que vous codez dans Xamarin Android, mais comme en Java dans la xxxactivité.java pour production finale invoque doit être comme ceci

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

Méthode setMovementMethod() par le paramètre ScrollingMovementMethod() est la gimmick.

Etape 2

et dans la mise en page comme en Java-Android aussi en activity_xxx.xml pour la déclaration TextView comme ci-dessus doit ajouter ce

android:gravity="bottom"

quand vous ajoutez une nouvelle ligne dans le outputText comme ceci

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

faire défiler à la dernière ligne automatiquement, et c'est toute la magie pour vos besoins.

65
répondu NOTSermsak 2014-07-02 12:13:35

avait la même question. Essayé plusieurs décisions de cette discussion et similaires, rien n'a fonctionné. Résolu de cette façon:

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

après chaque .append() .

6
répondu Alexander Marochko 2015-07-01 22:32:06

Vous pouvez essayer dans 2 solutions:

  1. Mettre TextView dans un 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. utilisez custom scroll TextView (même que TextView traditionnel mais il peut faire défiler)

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

utilisation:

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

(ScrollTextView source de la classe: http://bear-polka.blogspot.com/2009/01/scrolltextview-scrolling-textview-for.html)

5
répondu Truong Phu Quoc 2013-11-07 02:46:29

aucune de ces réponses n'était tout à fait ce que je voulais, donc je suis venu avec ceci.

textView.append(log);

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

Ne pas oublier de méthode de mouvement avant de défilement

textView.setMovementMethod(new ScrollingMovementMethod());
5
répondu dogauzun 2016-06-14 08:16:37

à Partir de " comment faire défiler vers le bas dans un ScrollView au démarrage de l'activité":

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

Ce que vous avez besoin est de mettre fullScroll() après l'opération d'ajout.

3
répondu Mansour 2017-05-23 12:34:41

j'utilise Xmarin.

ma solution est comme beaucoup de gens mentionnés, à textView à l'intérieur d'un ScrollView.

Si vous voulez voir la nouvelle ligne au bas de l'affichage, utilisez

android:layout_gravity="bottom"

cela garde la nouvelle ligne en bas jusqu'à ce que vous défiliez la vue. La vue reste là où vous avez défilé.

Aucun code n'est nécessaire.

cependant, si vous voulez que le contenu soit toujours en bas après ajout, vous devez ajouter du code après append():

myText.Append(...);

myscroll.FullScroll(FocusSearchDirection.Down);
2
répondu Jim Oian 2016-11-10 20:52:29
  • scroller.scrollTo(0, 70); dans votre cours de java.Utilisez-le avant de définir votre textview mais après avoir ajouté cette chaîne. 52 dp est la hauteur de mon appareil.Vous pouvez le trouver en utilisant scroller.getBottom ()); J'ai donc utilisé 70 pour ajuster la vue scroll.
  • android:scrollY="30dp" dans votre textview.
0
répondu Surbhit Rao 2018-06-01 07:05:11