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
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..
à 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.
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()
.
Vous pouvez essayer dans 2 solutions:
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>
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)
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());
à 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.
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);
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.