Comment faire défiler de façon programmatique Android WebView

j'essaie de faire défiler programmatiquement un WebView à l'emplacement d'un élément particulier dans L'arbre DOM. Mais jusqu'à présent, je n'ai pas été en mesure d'obtenir le WebView pour répondre aux requêtes de défilement. J'ai essayé D'appeler JavaScript qui utilise window.scrollTo(...), mais le WebView ne répond pas. Du côté de Java, j'ai essayé d'appeler le WebView.flingScroll(...) méthode. WebView permettra de répondre à <!-Mais ce dont j'ai besoin, c'est d'un scrollTo(...) capacité. Des idées?

24
demandé sur duggu 2010-02-10 20:29:09

4 réponses

j'ai trouvé une meilleure réponse à cette question. Il s'avère que WebViewscrollTo(),getScrollX() et getScrollY() méthodes que vous attendez. Ils sont un peu cachés dans la documentation parce qu'ils sont hérités de View(via AbsoluteLayout -> ViewGroup -> View). C'est évidemment une meilleure façon de manipuler les WebView's la position de défilement de la un peu lourd JavaScript interface.

46
répondu Steve Liddle 2016-12-14 15:00:21

Il s'avère que le window.scrollTo() fonctionne, vous ne pouvez tout simplement pas ajouter votre propre méthode nommée scrollTo(). Pour une raison quelconque, mon propre scrollTo() méthode est invoquée quand j'ai appelé window.scrollTo().

donc, en résumé, pour faire défiler un WebView vers un élément DOM particulier, écrivez un JavaScript fonction pour faire 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);
}

et puis à partir de votre application Android (code Java), dites à votre WebView de charger une URL:

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

Il y a quelques problèmes avec cette approche, tels comme le défilement ne sera pas joliment animé, mais le mécanisme fonctionne.

L'objet DOM window indique correctement la position de défilement actuelle de la vue Web (voir window.pageXOffset,window.pageYOffset ou window.scrollX,window.scrollY). Si vous voulez juste connaître la position courante de défilement de la vue Web, écrivez du JavaScript pour appeler votre code Java et passer le long des offsets X/Y.

12
répondu Steve Liddle 2015-01-29 09:42:54

Vous ne pouvez pas faire cela en utilisant le code Java.

pour tous ceux qui sont coincés à ce problème, j'ai une certaine conclusion au sujet du défilement d'un webview sous android.

  • vous ne pouvez pas faire défiler un webview ou obtenir une position de défilement en utilisant le code Java.
  • Vous ne pouvez obtenir layoutHeight, measuredheight dans, contentHeight d'une webview, rien de plus. Ce sont toutes les api android qui vous permettent d'obtenir et de définir le statut scroll.
  • Mais, vous pouvez Outrepasser le onScorllChanged pour ajouter un écouteur auto-défini pour faire défiler un événement webview (ou un événement fling), vous serez informé de la position d'origine et de la nouvelle position.
  • Eh bien, vous pouvez faire défiler vers une position en utilisant le code JavaScript, comme ce qui suit, mais la performance est vraiment pauvre. Si vous voulez le faire défiler fréquemment, s'il vous plaît donner une seconde pensée.

    la fenêtre.scrollTo(de 100 500)

examinez votre situation et choisissez la bonne solution. Notez aussi que fling et scroll sont des choses différentes.

0
répondu York 2015-10-26 09:04:46
    @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
répondu irshst 2016-04-09 12:36:15