Question

J'affiche du texte dans un TextView qui semble trop long pour s'intégrer dans un seul écran.Je dois rendre mon TextView défilant.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);
Était-ce utile?

La solution

Vous n'avez pas besoin d'utiliser un ScrollView réellement.

Il suffit de régler la

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, il défile!

Autres conseils

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>

NOTES:

  1. android:fillViewport="true" combiné avec android:layout_weight="1.0" fera la textview prendre tout l'espace disponible.

  2. Lors de la définition du ScrollView, NE PAS indiquer android:layout_height="fill_parent" sinon le scrollview ne fonctionne pas! (Ce qui m'a causé à perdre une heure tout à l'heure! FFS).

PRO TIP:

Pour faire défiler vers le bas programme après 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 en 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);
    }
}

Faites votre textview simplement ajouter cette

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

Il ne faut pas mettre en

android:Maxlines="AN_INTEGER"`

Vous pouvez faire votre travail en ajoutant simplement:

android:scrollbars = "vertical"

Et, mettre ce code dans votre classe Java:

textview.setMovementMethod(new ScrollingMovementMethod());

Vous pouvez

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

La meilleure manière que je trouvais:

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

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

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

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 écrire un texte dedans ... 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 vue du texte entre le scrollview pour afficher la barre de défilement pour 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>

Ca y est ...

Simple

. Voici comment je l'ai fait:

  1. Side 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());
    

Bonus:

Pour que l'affichage de texte défiler vers le bas comme le texte le remplir, vous devez ajouter:

    android:gravity="bottom"

dans le fichier xml TextView. Il fera défiler vers le bas automatiquement plus de texte entre en jeu.

Bien sûr, vous devez ajouter le texte en utilisant la fonction append au lieu du texte de jeu:

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

Je l'ai utilisé à des fins journal.

J'espère que cette aide;)

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

Quoi qu'il en soit, le voici :

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

Le mTextStatus.getLineHeight() fera en sorte que vous ne scrollToBottom() si l'utilisateur se trouve à moins d'une ligne de la fin de ScrollView.

Cela fournira le texte de défilement régulier 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);

Si vous souhaitez que le texte défile dans le textview, vous pouvez suivre ce qui suit:

D'abord, vous devriez avoir à sous-classe textview.

Et puis utilisez cela.

Voici un exemple d'un 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 que dans le fichier 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"
 />

Voilà.

Je ne trouve pas TextView défiler pour soutenir le geste « fling », où il continue à faire défiler après un petit coup vers le haut ou vers le bas. J'ai fini par mettre en œuvre moi-même parce que je ne voulais pas utiliser un ScrollView pour diverses raisons, et il ne semble pas être un MovementMethod que les deux m'a permis de sélectionner du texte et cliquez sur les liens.

Ajoutez ce qui suit dans le textview en XML.

android:scrollbars="vertical"

Et enfin, ajouter

textView.setMovementMethod(new ScrollingMovementMethod());

dans le fichier Java.

Lorsque vous avez terminé avec scrollable, ajoutez cette ligne à la dernière ligne de la vue lorsque vous saisissez quelque chose dans la vue:

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

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

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

Si vous ne souhaitez pas utiliser la solution de 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());
}

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

Lors de l'ajout TextView à l'utilisation xml

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

Utilisez comme ceci

<TextView  
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:maxLines = "AN_INTEGER"
    android:scrollbars = "vertical"
/>

En Kotlin pour faire le textview scrollable

myTextView.movementMethod= ScrollingMovementMethod()

et ajouter dans cette propriété xml

    android:scrollbars = "vertical"

Dans mon case.Constraint Layout.AS 2.3.

Code de mise en œuvre:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

XML:

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

Mettre maxLines et scrollbars l'intérieur 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.
    />

Ensuite, dans le code java.

textView.setMovementMethod(new ScrollingMovementMethod());

J'ai eu ce problème quand j'utilisais TextView à l'intérieur du 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 devez utiliser le ScrollView comme parent , et vous utilisez également la méthode de mouvement de défilement avec TextView.

Lorsque vous portrait à paysage votre appareil que le temps se produit une question . (Comme) page entière est scrollable mais la méthode de mouvement de défilement ne peut pas fonctionner.

si vous avez encore besoin d'utiliser ScrollView comme méthode parent ou d'un mouvement de défilement, vous utilisez également ci-dessous desc.

Si vous n'avez pas de problème, vous 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

XML - Vous pouvez utiliser attribut android:scrollHorizontally

Si le texte est autorisé à être plus large que la vue (et peut donc être un défilement horizontal).

Peut être une valeur booléenne, comme « vrai » ou « faux ».

Prigramacaly - setHorizontallyScrolling(boolean)

Essayez ceci:

android:scrollbars = "vertical"

Je débattais avec cela pour plus d'une semaine et finalement compris comment faire ce travail!

Ma question était que tout comme faire défiler « bloc ». Le texte lui-même défilait, mais comme un morceau plutôt que ligne par ligne. Ceci n'a évidemment pas fonctionné pour moi, car il serait coupé des lignes en bas. Toutes les solutions précédentes ne fonctionne pas pour moi, donc je Crafted mon.

Voici la solution la plus loin:

Faire un fichier de classe appelé: 'PerfectScrollableTextView' dans un paquet, puis copiez et collez 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;
    }
}

modifier Enfin votre 'TextView' en XML:

De: <TextView

Pour: <com.your_app_goes_here.PerfectScrollableTextView

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top