Faire défiler TextView sur Android

J’affiche du texte dans une vue de texte qui semble trop longue pour tenir dans un seul écran. Je dois faire défiler mon TextView. Comment puis je faire ça?

Voici le code:

final TextView tv = new TextView(this); tv.setBackgroundResource(R.drawable.splash); tv.setTypeface(face); tv.setTextSize(18); tv.setTextColor(R.color.BROWN); tv.setGravity(Gravity.CENTER_VERTICAL| Gravity.CENTER_HORIZONTAL); tv.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent e) { Random r = new Random(); int i = r.nextInt(101); if (e.getAction() == e.ACTION_DOWN) { tv.setText(tips[i]); tv.setBackgroundResource(R.drawable.inner); } return true; } }); setContentView(tv); 

Vous n’avez pas besoin d’utiliser un ScrollView fait.

Il suffit de définir le

 android:scrollbars = "vertical" 

propriétés de votre TextView dans le fichier XML de votre mise en page.

Ensuite, utilisez:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

dans votre code.

Bingo, ça défile!

Voici comment je l’ai fait en XML:

       

REMARQUES:

  1. android:fillViewport="true" combiné avec android:layout_weight="1.0" fera que le textview occupera tout l’espace disponible.

  2. Lors de la définition de la vue de défilement, NE spécifiez PAS android:layout_height="fill_parent" sinon la défilement ne fonctionne pas! (cela m’a fait perdre une heure maintenant! FFS).

CONSEIL PRO:

Pour faire défiler par programme vers le bas après l’ajout de texte, utilisez ceci:

 mTextStatus = (TextView) findViewById(R.id.TEXT_STATUS_ID); mScrollView = (ScrollView) findViewById(R.id.SCROLLER_ID); private void scrollToBottom() { mScrollView.post(new Runnable() { public void run() { mScrollView.smoothScrollTo(0, mTextStatus.getBottom()); } }); } 

Tout ce qui est vraiment nécessaire est le setMovementMethod (). Voici un exemple d’utilisation d’un LinearLayout.

Fichier main.xml

     

Fichier WordExtractTest.java

 public class WordExtractTest extends Activity { TextView tv1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv1 = (TextView)findViewById(R.id.tv1); loadDoc(); } private void loadDoc() { Ssortingng s = ""; for(int x=0; x<=100; x++) { s += "Line: " + String.valueOf(x) + "\n"; } tv1.setMovementMethod(new ScrollingMovementMethod()); tv1.setText(s); } } 

Faites en sorte que votre textview ajoute simplement ceci

 TextView textview= (TextView) findViewById(R.id.your_textview_id); textview.setMovementMethod(new ScrollingMovementMethod()); 

Il n’est pas nécessaire de mettre en

 android:Maxlines="AN_INTEGER"` 

Vous pouvez faire votre travail en ajoutant simplement:

 android:scrollbars = "vertical" 

Et, mettez ce code dans votre classe Java:

 textview.setMovementMethod(new ScrollingMovementMethod()); 

Tu peux soit

  1. entourer le TextView par un ScrollView ; ou
  2. définir la méthode Movement sur ScrollingMovementMethod.getInstance(); .

Le meilleur moyen que j’ai trouvé:

Remplacez le TextView par un EditText avec ces atsortingbuts supplémentaires:

 android:background="@null" android:editable="false" android:cursorVisible="false" 

Il n’y a pas besoin d’envelopper dans un ScrollView.

Ceci est “Comment appliquer ScrollBar à votre TextView”, en utilisant uniquement XML.

Tout d’abord, vous devez prendre un contrôle Textview dans le fichier main.xml et y écrire du texte … comme ceci:

  

Ensuite, placez le contrôle de la vue texte entre la vue de défilement pour afficher la barre de défilement de ce texte:

      

C’est tout…

Simple. C’est comme ça que je l’ai fait:

  1. Côté XML:

         
  2. Côté Java:

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

Prime:

Pour que la vue de texte défile vers le bas pendant que le texte le remplit, vous devez append:

  android:gravity="bottom" 

au fichier XML TextView. Il défilera automatiquement au fur et à mesure de l’arrivée du texte.

Bien sûr, vous devez append le texte en utilisant la fonction append au lieu du texte défini:

  tv_log.append("\n" + text); 

Je l’ai utilisé à des fins logistiques.

J’espère que ça aide 😉

Le “conseil pro” ci-dessus de Someone Somewhere ( Rendre TextView défilable sur Android ) fonctionne très bien, mais que faire si vous ajoutez dynamicment du texte à ScrollView et que vous souhaitez faire défiler automatiquement vers le bas après un ajout uniquement lorsque l’utilisateur est à le bas de la ScrollView? (Peut-être parce que si l’utilisateur a fait défiler pour lire quelque chose, vous ne voulez pas automatiquement le redéfinir en bas pendant une append, ce qui serait ennuyeux.)

En tout cas, le voici:

 if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <= (mScrollView.getHeight() + mTextStatus.getLineHeight())) { scrollToBottom(); } 

Le mTextStatus.getLineHeight () fera en sorte que vous ne ferez pas scrollToBottom () si l'utilisateur se trouve dans une ligne à partir de la fin du ScrollView.

Cela fournira un texte défilant en douceur avec une barre de défilement.

 ScrollView scroller = new ScrollView(this); TextView tv = new TextView(this); tv.setText(R.ssortingng.my_text); scroller.addView(tv); 

Si vous souhaitez faire défiler le texte dans la vue texte, vous pouvez suivre les étapes suivantes:

Vous devez d’abord sous-class textview.

Et puis utilisez ça.

Voici un exemple de textview sous-classé.

 public class AutoScrollableTextView extends TextView { public AutoScrollableTextView(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); setEllipsize(TruncateAt.MARQUEE); setMarqueeRepeatLimit(-1); setSingleLine(); setHorizontallyScrolling(true); } public AutoScrollableTextView(Context context, AtsortingbuteSet attrs) { super(context, attrs); setEllipsize(TruncateAt.MARQUEE); setMarqueeRepeatLimit(-1); setSingleLine(); setHorizontallyScrolling(true); } public AutoScrollableTextView(Context context) { super(context); setEllipsize(TruncateAt.MARQUEE); setMarqueeRepeatLimit(-1); setSingleLine(); setHorizontallyScrolling(true); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public void onWindowFocusChanged(boolean focused) { if(focused) super.onWindowFocusChanged(focused); } @Override public boolean isFocused() { return true; } } 

Maintenant, vous devez utiliser cela dans le XML de cette manière:

   

C’est tout.

Je n’ai pas trouvé le défilement de TextView pour supporter le geste de “fling”, où il continue à défiler après un balayage vers le haut ou le bas. J’ai fini par l’implémenter car je ne voulais pas utiliser une ScrollView pour diverses raisons, et il ne semblait pas y avoir une méthode MovementMet me permettant de sélectionner du texte et de cliquer sur des liens.

Ajoutez ce qui suit dans la vue textuelle en XML.

 android:scrollbars="vertical" 

Et enfin, ajoutez

 textView.setMovementMethod(new ScrollingMovementMethod()); 

dans le fichier Java.

Lorsque vous en avez fini avec le défilement, ajoutez cette ligne à la dernière ligne de la vue lorsque vous entrez quelque chose dans la vue:

 ((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN); 

Ajoutez ceci à votre disposition XML:

 android:ellipsize="marquee" android:focusable="false" android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally="true" android:singleLine="true" android:text="To Make An textView Scrollable Inside The TextView Using Marquee" 

Et dans le code, vous devez écrire les lignes suivantes:

 textview.setSelected(true); textView.setMovementMethod(new ScrollingMovementMethod()); 

Si vous ne souhaitez pas utiliser la solution EditText, vous pouvez avoir plus de chance avec:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.yourLayout); (TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance()); } 

Le code ci-dessous crée une vue de texte à défilement horizontal automatique:

En ajoutant TextView à l’utilisation du XML

  

Définissez les propriétés suivantes de TextView dans onCreate ()

 tv.setSelected(true); tv.setHorizontallyScrolling(true); 

Utilisez-le comme ça

  

Dans mon cas.Constraint Layout.AS 2.3.

Mise en œuvre du code:

 YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod()); 

XML:

 android:scrollbars="vertical" android:scrollIndicators="right|end" 

J’ai lutté avec cela pendant plus d’une semaine et j’ai finalement compris comment faire fonctionner ça!

Mon problème était que tout défilerait comme un «bloc». Le texte lui-même défilait, mais sous forme de morceau plutôt que ligne par ligne. Cela ne fonctionnait évidemment pas pour moi, car cela couperait les lignes en bas. Toutes les solutions précédentes ne fonctionnaient pas pour moi, alors j’ai créé les miennes.

Voici la solution la plus simple de loin:

Créez un fichier de classe appelé: ‘PerfectScrollableTextView’ dans un package, puis copiez et collez ce code dans:

 import android.content.Context; import android.graphics.Rect; import android.util.AtsortingbuteSet; import android.widget.TextView; public class PerfectScrollableTextView extends TextView { public PerfectScrollableTextView(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); setVerticalScrollBarEnabled(true); setHorizontallyScrolling(false); } public PerfectScrollableTextView(Context context, AtsortingbuteSet attrs) { super(context, attrs); setVerticalScrollBarEnabled(true); setHorizontallyScrolling(false); } public PerfectScrollableTextView(Context context) { super(context); setVerticalScrollBarEnabled(true); setHorizontallyScrolling(false); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public void onWindowFocusChanged(boolean focused) { if(focused) super.onWindowFocusChanged(focused); } @Override public boolean isFocused() { return true; } } 

Enfin, changez votre “TextView” en XML:

De:

Pour:

Placez maxLines et les scrollbars dans TextView dans xml.

  

Puis en code java.

textView.setMovementMethod(new ScrollingMovementMethod());

J’ai eu ce problème lorsque j’utilisais TextView dans ScrollView . Cette solution a fonctionné pour moi.

 scrollView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { description.getParent().requestDisallowInterceptTouchEvent(false); return false; } }); description.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { description.getParent().requestDisallowInterceptTouchEvent(true); return false; } }); 

chaque fois que vous avez besoin d’ utiliser ScrollView en tant que parent , et que vous utilisez également la méthode de mouvement de défilement avec TextView.

Et lorsque vous tracez un portrait de votre appareil, il arrive un problème . (comme) toute la page est défilable, mais la méthode de défilement ne peut pas fonctionner.

Si vous avez encore besoin d’utiliser ScrollView comme méthode parent ou de défilement, utilisez également desc.

Si vous n’avez aucun problème, utilisez EditText au lieu de TextView

voir ci-dessous :

  

Ici, le EditText se comporte comme TextView

Et votre problème sera résolu