Puis-je faire défiler un ScrollView par programmation dans Android?

Existe-t-il un moyen de faire défiler un ScrollView programmation vers une certaine position?

J’ai créé Dynamic TableLayout qui est placé dans un ScrollView . Je veux donc que sur une action spécifique (comme cliquer sur un bouton, etc.), la ligne particulière fasse défiler automatiquement vers une position supérieure.

C’est possible?

 ScrollView sv = (ScrollView)findViewById(R.id.scrl); sv.scrollTo(0, sv.getBottom()); 

ou

sv.scrollTo(5, 10);

La réponse de Pragna ne fonctionne pas toujours, essayez ceci:

 mScrollView.post(new Runnable() { public void run() { mScrollView.scrollTo(0, mScrollView.getBottom()); } }); 

ou

 mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(mScrollView.FOCUS_DOWN); } }); 

Je voulais que scrollView défile directement après onCreateView () (pas après un clic de bouton, par exemple). Pour le faire fonctionner, je devais utiliser un ViewTreeObserver:

 mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } }); } }); 

Mais attention, cela sera appelé à chaque fois que quelque chose est mis en page (par exemple si vous définissez une vue invisible ou similaire) alors n’oubliez pas de supprimer cet écouteur si vous n’en avez plus besoin avec:

public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) sur le SDK Lvl <16

ou

public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) dans public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) Lvl> = 16

Utilisez quelque chose comme ceci:

 mScrollView.scrollBy(10, 10); 

ou

 mScrollView.scrollTo(10, 10); 

Il y a beaucoup de bonnes réponses ici, mais je veux seulement append une chose. Il arrive parfois que vous souhaitiez faire défiler votre ScrollView vers une vue spécifique de la mise en page, au lieu d’un défilement complet en haut ou en bas.

Un exemple simple: dans un formulaire d’inscription, si l’utilisateur appuie sur le bouton “Inscription” lorsqu’un texte de modification du formulaire n’est pas rempli, vous souhaitez faire défiler le texte de modification spécifique pour indiquer à l’utilisateur qu’il doit remplir ce champ.

Dans ce cas, vous pouvez faire quelque chose comme ça:

 scrollView.post(new Runnable() { public void run() { scrollView.scrollTo(0, editText.getBottom()); } }); 

ou, si vous voulez un défilement lisse au lieu d’un défilement instantané:

 scrollView.post(new Runnable() { public void run() { scrollView.smoothScrollTo(0, editText.getBottom()); } }); 

De toute évidence, vous pouvez utiliser n’importe quel type de vue au lieu de modifier le texte. Notez que getBottom () renvoie les coordonnées de la vue en fonction de sa présentation parente, de sorte que toutes les vues utilisées dans ScrollView ne doivent avoir qu’un parent (par exemple, une disposition linéaire).

Si vous avez plusieurs parents dans l’enfant de ScrollView, la seule solution que j’ai trouvée consiste à appeler requestChildFocus sur la vue parente:

 editText.getParent().requestChildFocus(editText, editText); 

mais dans ce cas, vous ne pouvez pas avoir un défilement régulier.

J’espère que cette réponse peut aider quelqu’un avec le même problème.

Essayez d’utiliser la méthode scrollTo Plus d’informations

Si vous voulez faire défiler instantanément, vous pouvez utiliser:

 ScrollView scroll= (ScrollView)findViewById(R.id.scroll); scroll.scrollTo(0, scroll.getBottom()); OR scroll.fullScroll(View.FOCUS_DOWN); OR scroll.post(new Runnable() { @Override public void run() { scroll.fullScroll(View.FOCUS_DOWN); } }); 

Ou si vous voulez faire défiler doucement et lentement pour pouvoir l’utiliser:

 private void sendScroll(){ final Handler handler = new Handler(); new Thread(new Runnable() { @Override public void run() { try {Thread.sleep(100);} catch (InterruptedException e) {} handler.post(new Runnable() { @Override public void run() { scrollView.fullScroll(View.FOCUS_DOWN); } }); } }).start(); } 

J’ai eu ceci pour travailler au bout d’un ScrollView (avec un TextView à l’intérieur):

(Je mets ceci sur une méthode qui met à jour le TextView)

 final ScrollView myScrollView = (ScrollView) findViewById(R.id.myScroller); myScrollView.post(new Runnable() { public void run() { myScrollView.fullScroll(View.FOCUS_DOWN); } }); 

Oui, vous pouvez.

Disons que vous avez une Layout et à l’intérieur de cela, vous avez beaucoup de Views . Donc, si vous voulez faire défiler une View programmation, vous devez écrire l’extrait de code suivant:

Par exemple.

content_main.xml

       

MainActivity.java

 ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView); Button btn = (Button) findViewById(R.id.ivEventBanner); TextView txtView = (TextView) findViewById(R.id.ivEditBannerImage); 

Si vous voulez faire défiler une View spécifique, disons txtview dans ce cas, écrivez simplement:

 scrollView.smoothScrollTo(txtView.getScrollX(),txtView.getScrollY()); 

Et vous avez terminé. .

Note: si vous êtes déjà dans un thread, vous devez créer un nouveau thread de post, ou il ne faut pas faire défiler new long height jusqu’à la fin (pour moi). Pour ex:

 void LogMe(final Ssortingng s){ runOnUiThread(new Runnable() { public void run() { connectionLog.setText(connectionLog.getText() + "\n" + s); final ScrollView sv = (ScrollView)connectLayout.findViewById(R.id.scrollView); sv.post(new Runnable() { public void run() { sv.fullScroll(sv.FOCUS_DOWN); /* sv.scrollTo(0,sv.getBottom()); sv.scrollBy(0,sv.getHeight());*/ } }); } }); } 

Ajout d’une autre réponse qui n’implique pas de coordonnées.

Cela amènera votre vue désirée à se concentrer (mais pas à la position supérieure):

  yourView.getParent().requestChildFocus(yourView,yourView); 

public void RequestChildFocus (Afficher l’enfant, Afficher la vue)

child – L’enfant de ce ViewParent qui veut se concentrer. Cette vue contiendra la vue ciblée. Ce n’est pas nécessairement le sharepoint vue qui a réellement le focus.

focalisé – La vue qui est un descendant de l’enfant qui a réellement le focus

** faire défiler jusqu’à la hauteur désirée. J’ai trouvé une bonne solution **

  scrollView.postDelayed(new Runnable() { @Override public void run() { scrollView.scrollBy(0, childView.getHeight()); } }, 100); 

J’utilisais le Runnable avec sv.fullScroll (View.FOCUS_DOWN); Cela fonctionne parfaitement pour le problème immédiat, mais cette méthode fait que ScrollView prend le Focus à partir de tout l’écran, si vous faites en sorte qu’AutoScroll se produise à chaque fois, aucun EditText ne sera capable de recevoir des informations de l’utilisateur. sous le runnable:

sv.scrollTo (0, sv.getBottom () + sv.getScrollY ());

faire la même chose sans perdre de vue les points de vue importants

salutations.

Tout le monde affiche des réponses si compliquées.

J’ai trouvé une réponse facile, pour faire défiler vers le bas, bien:

 final ScrollView myScroller = (ScrollView) findViewById(R.id.myScrollerView); // Scroll views can only have 1 child, so get the first child's bottom, // which should be the full size of the whole content inside the ScrollView myScroller.smoothScrollTo( 0, myScroller.getChildAt( 0 ).getBottom() ); 

Et, si nécessaire, vous pouvez mettre la deuxième ligne de code ci-dessus dans un fichier exécutable:

 myScroller.post( new Runnable() { @Override public void run() { myScroller.smoothScrollTo( 0, myScroller.getChildAt( 0 ).getBottom() ); } } 

Il m’a fallu beaucoup de recherches et de jeux pour trouver cette solution simple. J’espère que cela vous aidera aussi! 🙂

juste faire défiler la page:

 ScrollView sv = (ScrollView) findViewById(your_scroll_view); sv.pageScroll(View.FOCUS_DOWN); 

ça marche pour moi

 mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } }); } });