J'ai une très longue activité avec un scrollview. C'est un formulaire avec différents champs que l'utilisateur doit remplir. J'ai une case à cocher à mi-chemin de mon formulaire, et lorsque l'utilisateur le vérifie, je veux faire défiler jusqu'à une partie spécifique de la vue. Existe-t-il un moyen de faire défiler un objet EditText (ou tout autre objet de vue) par programme?
De plus, je sais que cela est possible en utilisant les coordonnées X et Y mais je veux éviter de le faire car le formulaire peut changer d'un utilisateur à l'autre.
android
view
android-edittext
scrollview
programmatically-created
NotACleverMan
la source
la source
the form may changed from user to user
mais vous pouvez simplement utilisermEditView.getTop();
Réponses:
la source
your_scrollview.post(...
La réponse de Sherif elKhatib peut être grandement améliorée si vous souhaitez faire défiler la vue vers le centre de la vue de défilement . Cette méthode réutilisable fait défiler la vue vers le centre visible d'un HorizontalScrollView.
Pour une
ScrollView
utilisation verticalela source
Cela fonctionne bien pour moi:
enfant - L'enfant de ce ViewParent qui veut se concentrer. Cette vue contiendra la vue focalisée. Ce n'est pas nécessairement le point de vue qui a le focus.
concentré - La vue qui est un descendant d'un enfant qui a réellement le focus
la source
À mon avis, la meilleure façon de faire défiler un rectangle donné est via
View.requestRectangleOnScreen(Rect, Boolean)
. Vous devez l'appeler sur un queView
vous souhaitez faire défiler et passer un rectangle local que vous souhaitez être visible à l'écran. Le deuxième paramètre doit êtrefalse
pour un défilement fluide ettrue
pour un défilement immédiat.la source
scrollview.smoothScrollTo
ne fonctionnera pas si la vue requise est hors écran, (essayé dans l'émulateur Android avec la version sdk 26)new Handler().post()
?J'ai fait une petite méthode utilitaire basée sur Answer from WarrenFaith, ce code prend également en compte si cette vue est déjà visible dans le scrollview, pas besoin de faire défiler.
la source
scrollBounds
devrait être le paramètre de lascrollView.getHitRect
méthode.Vous devez
TextView
concentrer votre demande:la source
Mon EditText était imbriqué de plusieurs couches à l'intérieur de mon ScrollView, qui n'est pas lui-même la vue racine de la mise en page. Parce que getTop () et getBottom () semblaient signaler les coordonnées dans sa vue contenant, je l'ai fait calculer la distance entre le haut de ScrollView et le haut de EditText en itérant à travers les parents de EditText.
la source
Une autre variante serait:
ou vous pouvez utiliser la
post()
méthode.la source
Je sais que cela peut être trop tard pour une meilleure réponse, mais une solution parfaite souhaitée doit être un système comme un positionneur. Je veux dire, quand le système fait un positionnement pour un champ Editor, il place le champ juste jusqu'au clavier, donc comme règles UI / UX, c'est parfait.
Ce que le code ci-dessous fait, c'est la façon dont Android se positionne en douceur. Tout d'abord, nous gardons le point de défilement actuel comme point de référence. La deuxième chose est de trouver le meilleur point de défilement de positionnement pour un éditeur, pour ce faire, nous faisons défiler vers le haut, puis demandons aux champs de l'éditeur de faire en sorte que le composant ScrollView fasse le meilleur positionnement. Gatcha! Nous avons appris la meilleure position. Maintenant, ce que nous allons faire, c'est faire défiler en douceur du point précédent au point que nous avons trouvé récemment. Si vous le souhaitez, vous pouvez omettre le défilement fluide en utilisant scrollTo au lieu de smoothScrollTo uniquement.
REMARQUE: le conteneur principal ScrollView est un champ membre nommé scrollViewSignup, car mon exemple était un écran d'inscription, comme vous pouvez le voir beaucoup.
Si vous souhaitez utiliser ce bloc pour toutes les instances EditText et l'intégrer rapidement à votre code d'écran. Vous pouvez simplement faire un traverseur comme ci-dessous. Pour ce faire, j'ai fait de OnFocusChangeListener un champ membre nommé focusChangeListenerToScrollEditor , et je l'ai appelé pendant onCreate comme ci-dessous.
Et l'implémentation de la méthode est comme ci-dessous.
Donc, ce que nous avons fait ici, c'est que tous les enfants de l'instance EditText appellent l'écouteur au focus.
Pour atteindre cette solution, j'ai vérifié toutes les solutions ici et généré une nouvelle solution pour un meilleur résultat UI / UX.
la source
Les réponses ci-dessus fonctionneront bien si ScrollView est le parent direct de ChildView. Si votre ChildView est encapsulé dans un autre ViewGroup dans le ScrollView, il provoquera un comportement inattendu car View.getTop () obtient la position par rapport à son parent. Dans ce cas, vous devez implémenter ceci:
la source
référence: https://stackoverflow.com/a/6438240/2624806
La suite a fonctionné beaucoup mieux.
la source
Je pense avoir trouvé une solution plus élégante et moins sujette aux erreurs en utilisant
Il n'y a pas de mathématiques impliquées, et contrairement aux autres solutions proposées, il gérera correctement le défilement vers le haut et vers le bas.
C'est une bonne idée de l'envelopper
postDelayed
pour le rendre plus fiable, au cas où leScrollView
changement serait en coursla source
En examinant le code source Android, vous pouvez constater qu'il existe déjà une fonction membre de
ScrollView
-scrollToChild(View)
- qui fait exactement ce qui est demandé. Malheureusement, cette fonction est marquée pour une raison obscureprivate
. Sur la base de cette fonction, j'ai écrit la fonction suivante qui trouve la premièreScrollView
au-dessus duView
paramètre spécifié et la fait défiler de sorte qu'elle devienne visible dansScrollView
:la source
Ma solution est:
la source
Répondre à mon projet pratique.
la source
Dans mon cas, ce n'est pas
EditText
çagoogleMap
. Et cela fonctionne avec succès comme ça.la source
Que: existe-t-il un moyen de faire défiler par programme une vue de défilement vers un éditxt spécifique?
Rép: la vue de défilement imbriquée dans la dernière position de la vue de recyclage a ajouté des données d'enregistrement.
Existe-t-il un moyen de faire défiler par programme une vue de défilement vers un texte d'édition spécifique?
la source
Voici ce que j'utilise:
Cela obtient la quantité de défilement nécessaire pour afficher le bas de la vue, y compris toute marge en bas de cette vue.
la source
Défilement vertical, bon pour les formulaires. La réponse est basée sur le défilement horizontal Ahmadalibaloch.
la source
HorizontalScrollView
dans cette méthode?Vous pouvez utiliser
ObjectAnimator
comme ceci:la source
Sur la base de la réponse de Sherif, les éléments suivants ont fonctionné le mieux pour mon cas d'utilisation. Les changements notables sont
getTop()
au lieu degetBottom()
etsmoothScrollTo()
au lieu descrollTo()
.la source
Si scrlMain est votre NestedScrollView, utilisez ce qui suit,
la source