Rendre TextView scrollable sur Android

j'affiche un texte dans une version textview qui semble être trop long pour s'adapter en un seul écran. J'ai besoin de rendre mon TextView scrollable. Comment puis-je faire qui?

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);
639
demandé sur Peter Mortensen 2009-11-17 16:43:03

24 réponses

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

vient de définir le

android:scrollbars = "vertical"

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

ensuite utiliser:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

dans votre code.

Bingo, ça défile!

1453
répondu Amit Chintawar 2018-07-24 09:31:25

C'est ainsi que je l'ai fait 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" , le textview occupera toute la place disponible.

  2. lors de la définition du Scrollview, ne spécifiez pas android:layout_height="fill_parent" sinon le scrollview ne fonctionne pas! (ce qui m'a fait perdre une heure tout à l'heure! FFS).

CONSEIL DU PRO:

pour faire défiler programmatiquement vers le bas après avoir ajouté du 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());
        }
    });
}
276
répondu Someone Somewhere 2017-04-28 23:27:45

Tout ce qui est vraiment nécessaire est la méthode setmovement(). Voici un exemple d'utilisation de LinearLayout.

Fichier principal.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>

File Wordextractest.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);
    }
}
117
répondu EddieB 2017-04-28 23:24:36

Faites votre textview juste en ajoutant ce

TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
44
répondu matasoy 2013-07-26 02:23:41

il n'est pas nécessaire de mettre dans

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());
36
répondu Ahsan Raza 2017-04-28 23:38:51

vous pouvez soit

  1. entourent le TextView par un ScrollView ; ou
  2. régler la méthode du mouvement à ScrollingMovementMethod.getInstance(); .
27
répondu Samuh 2017-04-28 23:22:52

Le meilleur moyen que j'ai trouvé:

remplacer le TextView par un texte D'édition avec ces attributs supplémentaires:

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

il n'est pas nécessaire de l'envelopper dans un ScrollView.

17
répondu Valentin Galea 2017-04-28 23:28:22

C'est" comment appliquer ScrollBar à votre TextView", en utilisant seulement XML.

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

<TextView
    android:id="@+id/TEXT"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="@string/long_text"/>

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent">

    <ScrollView
        android:id="@+id/ScrollView01"
        android:layout_height="150px"
        android:layout_width="fill_parent">

        <TextView
            android:id="@+id/TEXT"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/long_text"/>

    </ScrollView>
</RelativeLayout>

C'est ça...

13
répondu mOmO 2017-04-28 23:29:23

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

  1. côté XML:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        tools:context="com.mbh.usbcom.MainActivity">
        <TextView
            android:id="@+id/tv_log"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:text="Log:" />
    </RelativeLayout>
    
  2. Java côté:

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

Bonus:

pour laisser le texte Afficher défiler vers le bas comme le texte le remplir, vous devez ajouter:

    android:gravity="bottom"

au fichier xml TextView. Faire défiler vers le bas automatiquement plus de texte.

bien sûr, vous devez ajouter le texte en utilisant la fonction Ajouter au lieu du texte défini:

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

Je L'ai utilisé pour le Log purpose.

j'espère que cette aide ;)

12
répondu MBH 2017-11-17 05:35:05

le" pro tip "ci-dessus de Quelqu'un quelque part ( faire scrollable TextView sur Android ) fonctionne très bien, cependant, que faire si vous ajoutez dynamiquement du texte dans le ScrollView et que vous souhaitez faire défiler automatiquement vers le bas après un ajout seulement lorsque l'utilisateur est au bas de la ScrollView? (Peut-être parce que si l'Utilisateur a glissé vers le haut pour lire quelque chose que vous ne voulez pas automatiquement réinitialiser au fond pendant une annexe, qui serait être ennuyeux.)

en tout cas, le voilà:

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

the mTextStatus.getLineHeight() fera en sorte que vous ne scrollToBottom () si l'utilisateur se trouve à l'intérieur d'une ligne à partir de la fin du ScrollView.

11
répondu Mark Cramer 2017-05-23 10:31:37

ceci fournira un texte à défilement lisse avec une barre de défilement.

ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);
9
répondu IT-Dan 2012-12-20 12:29:03

si vous voulez que le texte soit scrollé dans textview, alors vous pouvez suivre ce qui suit:

vous devez d'abord sous-classe textview.

et utilisez ça.

voici un exemple de textview sous-classé.

public class AutoScrollableTextView extends TextView {

    public AutoScrollableTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setEllipsize(TruncateAt.MARQUEE);
        setMarqueeRepeatLimit(-1);
        setSingleLine();
        setHorizontallyScrolling(true);
    }

    public AutoScrollableTextView(Context context, AttributeSet 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 façon:

 <com.yourpackagename.AutoScrollableTextView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="This is very very long text to be scrolled"
 />

C'est ça.

8
répondu Dipendra 2017-04-28 23:32:18

Je n'ai pas trouvé de défilement TextView pour supporter le geste "fling", où il continue de défiler après un flick vers le haut ou vers le bas. J'ai fini par le mettre en œuvre moi-même parce que je ne voulais pas utiliser un ScrollView pour diverses raisons, et il ne semblait pas y avoir de méthode de mouvement qui me permettait à la fois de sélectionner du texte et de cliquer sur des liens.

6
répondu android.weasel 2011-06-30 14:15:04

ajouter ce qui suit dans le textview en XML.

android:scrollbars="vertical"

et enfin, ajouter

textView.setMovementMethod(new ScrollingMovementMethod());

dans le fichier Java.

5
répondu user3921740 2017-04-28 23:34:07

lorsque vous avez terminé avec scrollable, Ajoutez cette ligne à la dernière ligne de la vue lorsque vous entrez quoi que ce soit dans la vue:

((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);
4
répondu Rahul Baradia 2017-04-28 23:30:08

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 en code vous devez écrire les lignes suivantes:

textview.setSelected(true);
textView.setMovementMethod(new ScrollingMovementMethod());
4
répondu Ritesh 2017-04-28 23:33:19

si vous ne voulez pas utiliser la solution EditText alors vous pourriez 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());
}
3
répondu Justin Buser 2012-10-27 14:38:29

le code ci-dessous crée un défilement horizontal automatique textview:

tout en ajoutant TextView à l'utilisation xml

<TextView android:maxLines="1" 
          android:ellipsize="marquee"
          android:scrollHorizontally="true"/>

définit les propriétés suivantes de TextView dans onCreate ()

tv.setSelected(true);
tv.setHorizontallyScrolling(true); 
2
répondu whitepearl 2016-09-24 16:54:46

utilisez - le comme ceci

<TextView  
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:maxLines = "AN_INTEGER"
    android:scrollbars = "vertical"
/>
1
répondu Kamil Ibadov 2018-01-17 08:05:34

dans mon cas.Disposition Des Contraintes.AS 2.3.

mise en œuvre du Code:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

XML:

android:scrollbars="vertical"
android:scrollIndicators="right|end"
0
répondu Sasha 888 2017-03-23 11:21:53

j'ai lutté avec cela pendant plus d'une semaine et finalement trouvé comment faire ce travail!

mon problème était que tout défilerait comme un "bloc". Le texte lui-même était défilant, mais comme un morceau plutôt que ligne par ligne. Cela n'a évidemment pas fonctionné pour moi, parce que ça couperait les lignes en bas. Toutes les solutions précédentes n'ont pas fonctionné pour moi, j'ai donc conçu mon propre.

voici de loin la solution la plus facile:

créer un fichier de classe appelé: 'PerfectScrollableTextView' dans un paquet, puis copier-coller ce code dans:

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;

public class PerfectScrollableTextView extends TextView {

    public PerfectScrollableTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setVerticalScrollBarEnabled(true);
        setHorizontallyScrolling(false);
    }

    public PerfectScrollableTextView(Context context, AttributeSet 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;
    }
}

changez finalement votre 'TextView' en XML:

de: <TextView

à: <com.your_app_goes_here.PerfectScrollableTextView

0
répondu Petro 2017-04-28 23:36:32

mettez maxLines et scrollbars dans TextView en xml.

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:maxLines="5" // any number of max line here.
    />

puis en code java.

textView.setMovementMethod(new ScrollingMovementMethod());

0
répondu Khemraj 2018-05-13 18:25:21

j'ai eu ce problème quand j'ai utilisé TextView dans le 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;
            }
        });
0
répondu Rohit Mandiwal 2018-06-06 01:23:18

chaque fois que vous avez besoin de utilisez le ScrollView comme parent , et vous utilisez également la méthode de déplacement de rouleau avec TextView.

Et Quand vous du portrait au paysage de votre appareil que le temps de se produire un problème . (comme) la page entière est scrollable mais la méthode du mouvement de rouleau ne peut pas fonctionner.

si vous avez toujours besoin d'utiliser ScrollView comme méthode de mouvement parent ou scroll, alors vous utilisez aussi desc.

si vous n'avez pas de problèmes, utilisez EditText au lieu de TextView

voir ci-dessous:

<EditText
     android:id="@+id/description_text_question"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="@null"
     android:editable="false"
     android:cursorVisible="false"
     android:maxLines="6"/>

ici, L'EditText se comporte comme TextView

Et votre problème sera résolu

0
répondu D Prince 2018-07-12 13:28:50