web-dev-qa-db-fra.com

Comment faire défiler par programme Android WebView

J'essaie de faire défiler par programmation une vue Web vers l'emplacement d'un élément particulier dans l'arborescence DOM. Mais jusqu'à présent, je n'ai pas réussi à faire en sorte que WebView réponde aux demandes de défilement. J'ai essayé d'appeler JavaScript qui utilise window.scrollTo(...), mais la WebView ne répond pas. Du côté de Java, j'ai essayé d'appeler la méthode WebView.flingScroll(...). WebView répondra à flingScroll, mais il me faut une capacité scrollTo(...). Des idées?

25
Steve Liddle

J'ai trouvé une meilleure réponse à ce problème. Il s'avère que WebView a les méthodes scrollTo(), getScrollX() et getScrollY() comme vous le souhaiteriez. Ils sont un peu cachés dans la documentation car ils sont hérités de View (via AbsoluteLayout -> ViewGroup -> View). C'est évidemment un meilleur moyen de manipuler la position de défilement de la WebView que de l'interface JavaScript un peu lourde.

47
Steve Liddle

Il s'avère que la fonction window.scrollTo() fonctionne, vous ne pouvez pas ajouter votre propre méthode nommée scrollTo(). Pour une raison quelconque, ma propre méthode scrollTo() était invoquée lorsque j'ai appelé window.scrollTo().

Donc, en résumé, pour faire défiler une vue Web vers un élément DOM particulier, écrivez une fonction JavaScript pour effectuer le défilement:

function scrollToElement(id) {
    var elem = document.getElementById(id);
    var x = 0;
    var y = 0;

    while (elem != null) {
        x += elem.offsetLeft;
        y += elem.offsetTop;
        elem = elem.offsetParent;
    }
    window.scrollTo(x, y);
}

puis, depuis votre application Android (code Java), indiquez à votre WebView de charger une URL:

webView.loadUrl("javascript:scrollToElement('" + elemId + "')");

Cette approche pose certains problèmes, tels que le défilement ne sera pas bien animé, mais le mécanisme général fonctionne.

L’objet Fenêtre DOM indique correctement la position de défilement actuelle de WebView (voir window.pageXOffset, window.pageYOffset ou window.scrollX, window.scrollY). Si vous voulez simplement connaître la position de défilement actuelle de WebView, écrivez du JavaScript pour appeler votre code Java et transmettez Compensation X/Y.

13
Steve Liddle
    @Override
        public void onPageFinished(final WebView view, String url) {

            super.onPageFinished(view, url);

                new Handler().postDelayed(new Runnable() {

                        @Override
                        public void run() {
                                if (app.scrollCache.containsKey(app.srctid))
            {
                            app.scrollSpot=app.scrollCache.get(app.srctid); 
                            view.scrollTo(0,(int)app.scrollSpot);
                            }
                        pageFinished=true;
                        }
                    }, 200);


    }
0
irshst

Vous ne pouvez pas faire cela en utilisant Java Code .

Pour tous ceux qui sont bloqués à ce problème, j'ai une conclusion à faire sur le défilement d'une vue Web dans Android.

  • Vous ne pouvez pas faire défiler une vue Web ou obtenir une position de défilement à l'aide du code Java.
  • Vous ne pouvez obtenir que layoutHeight, mesuréeHeight, contentHeight d'une vue Web, rien de plus. Ce sont tous les api Android vous permettant d'obtenir et de définir le statut de défilement.
  • Cependant, vous pouvez remplacer onScorllChanged pour ajouter un écouteur à définition automatique pour le défilement d'événement de vue Web (ou d'événement fling). Vous serez alors informé de la position d'origine et de la nouvelle position.
  • Eh bien, vous pouvez faire défiler une position à l'aide du code JavaScript, comme ci-dessous, mais les performances sont vraiment médiocres. Si vous souhaitez le faire défiler fréquemment, réfléchissez-y à deux fois.

    window.scrollTo (100 500) 

Examinez votre situation et choisissez une solution appropriée. Notez également que lancer et défiler sont des choses différentes.

0
York