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);
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!
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:
-
android:fillViewport="true"
combiné avecandroid:layout_weight="1.0"
, le textview occupera toute la place disponible. -
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());
}
});
}
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);
}
}
Faites votre textview juste en ajoutant ce
TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
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());
vous pouvez soit
- entourent le
TextView
par unScrollView
; ou - régler la méthode du mouvement à
ScrollingMovementMethod.getInstance();
.
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.
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...
Simple. C'est comme ça que je l'ai fait:
-
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>
-
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 ;)
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.
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);
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.
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.
ajouter 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 entrez quoi que ce soit 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 en code vous devez écrire les lignes suivantes:
textview.setSelected(true);
textView.setMovementMethod(new ScrollingMovementMethod());
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());
}
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);
utilisez - le comme ceci
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxLines = "AN_INTEGER"
android:scrollbars = "vertical"
/>
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"
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
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());
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;
}
});
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