249 votes

Existe-t-il un moyen de faire défiler par programme une vue de défilement vers un texte d'édition spécifique?

J'ai une très longue activité avec un scrollview. Il s'agit d'un formulaire avec différents champs que l'utilisateur doit remplir. J'ai une case à cocher à mi-chemin dans mon formulaire et lorsque l'utilisateur le coche, je souhaite faire défiler une partie spécifique de la vue. Est-il possible de faire défiler un objet EditText (ou tout autre objet 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.

518voto

Sherif elKhatib Points 23987
private final void focusOnView(){
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                your_scrollview.scrollTo(0, your_EditBox.getBottom());
            }
        });
    }

62voto

ahmadalibaloch Points 194

Vous reviendrez à cette réponse si vous avez besoin de faire défiler belle la vue de centre exact. Voici une réutilisables méthode pour faire défiler la barre d'amende le centre d'une Vue dans une HorizontalScrollView, avec lisse de défilement, ses merveilleux à l'aide de la vue propriétés.

private final void focusOnView(final HorizontalScrollView sv, final View v) {
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            int vLeft = v.getLeft();
            int vRight = v.getRight();
            int width = v.getWidth();
            sv.smoothScrollTo(((vLeft + vRight) / 2) - (width), 0);
        }
    });
}

même peut être utilisé pour de défilement verticale en changeant la position x et y de entrées à smoothScroll et v. getLeft() v. getTop() et v. getRight v. getBottom().

:)

12voto

user1281750 Points 2636

J'ai fait un petit utilitaire méthode basée sur la Réponse de WarrenFaith, ce code prend également en compte si ce point de vue est déjà visible dans la scrollview, pas besoin de faire défiler -> mauvais UX.

public static void scrollToView(final ScrollView scrollView, final View view) {

    // View needs a focus
    view.requestFocus();

    // Determine if scroll needs to happen
    final Rect scrollBounds = new Rect();
    scrollView.getHitRect(new Rect());
    if (!view.getLocalVisibleRect(scrollBounds)) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                scrollView.smoothScrollTo(0, view.getBottom());
            }
        });
    } 
}

11voto

Ovidiu Latcu Points 20783

Vous devriez faire de votre TextView attention:

    mTextView.requestFocus();

8voto

Mon EditText a été imbriquée plusieurs couches à l'intérieur de mon ScrollView, qui lui-même n'est pas la mise en page de la vue racine. Parce que getTop() et getBottom() ont été apparente à fournir les coordonnées à l'intérieur de son contenant vue, je l'ai eu calculer la distance entre le haut de la ScrollView vers le haut de la EditText en parcourant les parents de l'EditText.

// Scroll the view so that the touched editText is near the top of the scroll view
new Thread(new Runnable()
{
    @Override
    public
    void run ()
    {
        // Make it feel like a two step process
        Utils.sleep(333);

        // Determine where to set the scroll-to to by measuring the distance from the top of the scroll view
        // to the control to focus on by summing the "top" position of each view in the hierarchy.
        int yDistanceToControlsView = 0;
        View parentView = (View) m_editTextControl.getParent();
        while (true)
        {
            if (parentView.equals(scrollView))
            {
                break;
            }
            yDistanceToControlsView += parentView.getTop();
            parentView = (View) parentView.getParent();
        }

        // Compute the final position value for the top and bottom of the control in the scroll view.
        final int topInScrollView = yDistanceToControlsView + m_editTextControl.getTop();
        final int bottomInScrollView = yDistanceToControlsView + m_editTextControl.getBottom();

        // Post the scroll action to happen on the scrollView with the UI thread.
        scrollView.post(new Runnable()
        {
            @Override
            public void run()
            {
                int height =m_editTextControl.getHeight();
                scrollView.smoothScrollTo(0, ((topInScrollView + bottomInScrollView) / 2) - height);
                m_editTextControl.requestFocus();
            }
        });
    }
}).start();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X