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);
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!
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:
Android:fillViewport="true"
combiné avec Android:layout_weight="1.0"
fera que la visualisation de texte occupe tout l'espace disponible.
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());
}
});
}
Tout ce qui est vraiment nécessaire est setMovementMethod (). Voici un exemple d'utilisation de LinearLayout.
<?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>
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 ceci
TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
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());
Tu peux soit
TextView
par une ScrollView
; ouScrollingMovementMethod.getInstance();
.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.
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...
Simple. Voici comment 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>
Côté Java:
tv_log = (TextView) findViewById(R.id.tv_log);
tv_log.setMovementMethod(new ScrollingMovementMethod());
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 ;)
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.
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);
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.
Ajoutez ce qui suit dans la vue texte en XML.
Android:scrollbars="vertical"
Et enfin, ajoutez
textView.setMovementMethod(new ScrollingMovementMethod());
dans le fichier Java.
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.
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());
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);
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());
}
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);
Utilisez-le comme ça
<TextView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:maxLines = "AN_INTEGER"
Android:scrollbars = "vertical"
/>
Essaye ça:
Android:scrollbars = "vertical"
En kotlin pour faire défiler la vue texte
myTextView.movementMethod= ScrollingMovementMethod()
et aussi ajouter en XML cette propriété
Android:scrollbars = "vertical"
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
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)
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"
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;
}
});