917 votes

Faire défiler un TextView sur Android

J'affiche dans un TextView un texte qui semble trop long pour tenir sur un seul écran. dans un seul écran. J'ai besoin de rendre mon TextView défilable. Comment puis-je faire cela ?

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

2016voto

Amit Chintawar Points 5885

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

Il suffit de définir le

android:scrollbars = "vertical"

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

Alors utilisez :

yourTextView.setMovementMethod(new ScrollingMovementMethod());

dans votre code.

Bingo, ça défile !

106 votes

Mais sûrement maxLines vous demande d'entrer un nombre arbitraire ; ce n'est pas quelque chose qui fonctionnera pour toutes les tailles d'écran et de police ? Je trouve plus simple de l'entourer d'une balise ScrollView Ce qui signifie que je ne dois pas ajouter d'autres attributs XML ou du code (comme la définition de la méthode de mouvement).

14 votes

@Christopher, ScrollView requiert également 'Android:layout_height'.

12 votes

@Regex : Eh bien oui. Soit vous laissez le ScrollView occupe tout l'espace dont il a besoin (par exemple, via l'option android:fillViewport ), ou vous définissez la taille spécifique que vous souhaitez. Utilisation de maxLines ne doit pas être utilisé pour définir la taille des éléments de l'interface utilisateur, ce n'est donc pas une solution.

341voto

Someone Somewhere Points 8361

C'est ainsi que j'ai procédé purement en XML :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ScrollView
        android:id="@+id/SCROLLER_ID"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:fillViewport="true">

        <TextView
            android:id="@+id/TEXT_STATUS_ID"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1.0"/>
    </ScrollView>
</LinearLayout>

NOTES :

  1. android:fillViewport="true" combiné avec android:layout_weight="1.0" fera en sorte que la vue de texte prenne tout l'espace disponible.

  2. Lors de la définition du Scrollview, NE PAS spécifier android:layout_height="fill_parent" sinon le scrollview ne fonctionne pas ! (cela m'a fait perdre une heure à l'instant ! FFS).

PRO TIP :

Pour faire défiler le texte en bas de la page après l'avoir ajouté, utilisez la méthode suivante :

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

13 votes

Il n'y a pas besoin d'utiliser mTextView.getBottom() il suffit d'utiliser la méthode mScrollView.fullScroll(View.FOCUS_DOWN) car il fait partie de l'API ScrollView. Voir aquí y aquí pour plus d'informations.

9 votes

Android prévient que soit le LinearLayout ou le ScrollView peut s'avérer inutile dans cet exemple (j'ai supprimé les LinearLayout complètement). Il prévient également que pour le TextView il devrait être android:layout_height="wrap_content" pour correspondre à la ScrollView . Ces avertissements sont peut-être dus aux trois années qui se sont écoulées depuis que cette réponse a été publiée. Quoi qu'il en soit, cette réponse prend en charge le défilement fluide et le flicage... +1

0 votes

Ajout de <!--suppress AndroidLintUselessParent --> au-dessus de la ScrollView dans le fichier xml prendra soin de ces avertissements.

120voto

EddieB Points 2646

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

Fichier main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:id="@+id/tv1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="@string/hello"
    />
</LinearLayout>

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() {

        String s = "";

        for(int x=0; x<=100; x++) {
            s += "Line: " + String.valueOf(x) + "\n";
        }

        tv1.setMovementMethod(new ScrollingMovementMethod());

        tv1.setText(s);
    }
}

3 votes

Existe-t-il un moyen de définir cette propriété dans le XML ? Je me demande pourquoi ils ont laissé cette option de côté.

0 votes

Il fonctionne mais y a-t-il un moyen de le rafraîchir après le défilement ? je veux dire qu'après avoir fait défiler le TextView, je vais changer le texte dessus, mais sa position reste défilée même si ce n'est pas nécessaire. c'est parce que précédemment j'avais appliqué le défilement...

10 votes

Pas de barres de défilement, et le défilement est maladroit par rapport à la ScrollView méthode.

51voto

matasoy Points 171

Créez votre aperçu de texte en ajoutant simplement ceci

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

17 votes

Il ne fait pas de défilement cinétique. Ne l'utilisez pas.

3 votes

@Timmmm comment obtenir le parchemin cinétique ?

2 votes

Vous ne voulez pas de "défilement cinétique" pour un texte qui doit être lu.

29voto

Samuh Points 16564

Vous pouvez soit

  1. entourent le TextView par un ScrollView ; ou
  2. définir la méthode de mouvement à ScrollingMovementMethod.getInstance(); .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X