Rendre TextView défilable sur Android
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);
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:
-
android:fillViewport="true"
combiné avecandroid:layout_weight="1.0"
fera la textview prendre tout l'espace disponible. -
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
- entourer le
TextView
par unScrollView
; ou - 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 ...
. Voici comment je l'ai fait:
-
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>
-
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