web-dev-qa-db-fra.com

Faire défiler TextView sur Android

J'affiche du texte dans une vue texte qui semble trop longue pour tenir Dans un seul écran. J'ai besoin de 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);
663

Vous n'avez pas besoin d'utiliser un ScrollView en 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.

Alors utilisez:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

dans votre code.

Bingo, ça défile!

1590
Amit Chintawar

Voici comment je l'ai fait uniquement 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>

REMARQUES:

  1. Android:fillViewport="true" combiné avec Android:layout_weight="1.0" fera que la visualisation de texte occupe tout l'espace disponible.

  2. Lors de la définition de la vue de défilement, NE PAS spécifier Android:layout_height="fill_parent" sinon la vue de défilement ne fonctionne pas! (cela m'a fait perdre une heure tout à l'heure! FFS).

CONSEIL PRO:

Pour faire défiler par programme 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());
        }
    });
}
285
Someone Somewhere

Tout ce qui est vraiment nécessaire est setMovementMethod (). Voici un exemple d'utilisation de 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);
    }
}
119
EddieB

Faites votre textview juste en ajoutant ceci

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

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());
37
Ahsan Raza

Tu peux soit

  1. entourez la TextView par une ScrollView; ou
  2. définissez la méthode de déplacement sur ScrollingMovementMethod.getInstance();.
26
Samuh

Le meilleur moyen que j'ai trouvé:

Remplacez TextView par un EditText avec ces attributs supplémentaires:

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

Il n'est pas nécessaire d'encapsuler dans une ScrollView.

18
Valentin Galea

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:

<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 d'affichage du texte entre les vues de défilement 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 tout...

13
mOmO

Simple. Voici comment 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. Côté Java:

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

Prime:

Pour que la vue texte défile au fur et à mesure que le texte la remplit, vous devez ajouter:

    Android:gravity="bottom"

au fichier XML TextView. Il défilera automatiquement au fur et à mesure que plus de texte entrera.

Bien sûr, vous devez ajouter le texte en utilisant la fonction append à la place de set text:

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

Je l'ai utilisé à des fins de journal.

J'espère que ça aide ;)

12
MBH

Le "conseil pro" ci-dessus de Someone Somewhere ( Rendre TextView déroulable sur Android ) fonctionne à merveille. Cependant, que se passe-t-il si vous ajoutez dynamiquement du texte à ScrollView et souhaitez parcourir automatiquement le bas après un ajout seulement lorsque l'utilisateur est au bas de la ScrollView? (Peut-être parce que si l'utilisateur a fait défiler l'écran vers le haut pour lire quelque chose que vous ne voulez pas réinitialiser automatiquement vers le bas pendant un ajout, ce serait ennuyeux.)

Quoi qu'il en soit, la voici:

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

Le mTextStatus.getLineHeight () fera en sorte que vous ne faites pas scrollToBottom () si l'utilisateur est dans une ligne de la fin de la ScrollView.

11
Mark Cramer

Cela fournira un texte défilant 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
IT-Dan

Si vous souhaitez faire défiler le texte dans la vue texte, procédez comme suit:

Vous devez d’abord sous-classer textview.

Et puis 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 manière:

 <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 tout.

8
Dipendra

Ajoutez ce qui suit dans la vue texte en XML.

Android:scrollbars="vertical"

Et enfin, ajoutez

textView.setMovementMethod(new ScrollingMovementMethod());

dans le fichier Java.

6
user3921740

Je n'ai pas trouvé que TextView scrolling prenait en charge le geste de défilement, qui continuait à défiler après un glissement vers le haut ou le bas. J'ai fini par implémenter cela moi-même parce que je ne voulais pas utiliser ScrollView pour diverses raisons et qu'il ne semblait pas y avoir de méthode MovementMethod qui me permettait à la fois de sélectionner du texte et de cliquer sur des liens.

6
android.weasel

Ajoutez ceci à votre mise en page 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());
4
Ritesh

Lorsque vous avez terminé avec la fonction de défilement, ajoutez cette ligne à la dernière ligne de la vue lorsque vous entrez des éléments dans la vue:

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

Si vous ne souhaitez pas utiliser la solution EditText, vous aurez peut-être 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
Justin Buser

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

Tout en ajoutant TextView à XML utiliser

<TextView Android:maxLines="1" 
          Android:ellipsize="Marquee"
          Android:scrollHorizontally="true"/>

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

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

Utilisez-le comme ça

<TextView  
    Android:layout_width="match_parent" 
    Android:layout_height="match_parent" 
    Android:maxLines = "AN_INTEGER"
    Android:scrollbars = "vertical"
/>
1
Kamil Ibadov

Essaye ça:

Android:scrollbars = "vertical"
0
mohamad sheikhi

En kotlin pour faire défiler la vue texte

myTextView.movementMethod= ScrollingMovementMethod()

et aussi ajouter en XML cette propriété

    Android:scrollbars = "vertical"
0
Raluca Lucaci

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

Et lorsque vous créez un portrait de votre appareil à l’époque, vous rencontrez un problème . (comme) toute la page est déroulable mais la méthode de déplacement par défilement ne peut pas fonctionner.

si vous devez toujours utiliser ScrollView comme méthode de déplacement par défilement ou par parent, utilisez également desc. 

Si vous ne rencontrez aucun problème, 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, le EditText se comporte comme TextView

Et votre problème sera résolu

0
D Prince

XML - Vous pouvez utiliser l'attribut Android:scrollHorizontally

Indique si le texte est autorisé à être plus large que la vue (et peut donc faire défiler horizontalement).

Peut être une valeur booléenne, telle que "true" ou "false".

Prigramacaly - setHorizontallyScrolling(boolean)

0
sam

Dans mon cas.Constraint Layout.AS 2.3.

Implémentation du code:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

XML:

Android:scrollbars="vertical"
Android:scrollIndicators="right|end"
0
Sasha 888

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;
            }
        });
0
Rohit Mandiwal