Question

Je suis en train de faire défiler un programme WebView à l'emplacement d'un élément particulier dans l'arborescence DOM. Mais jusqu'à présent, je ne l'ai pas été en mesure d'obtenir le WebView pour répondre aux demandes faites défiler. J'ai essayé JavaScript appeler qui utilise window.scrollTo(...), mais le WebView ne répond pas. Du côté Java, j'ai essayé d'appeler la méthode WebView.flingScroll(...). WebView répondra à flingScroll, mais ce que j'ai besoin est d'une capacité de scrollTo(...). Toutes les idées?

Était-ce utile?

La solution

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

Autres conseils

Il se trouve que le window.scrollTo() fonctionne, vous ne pouvez pas ajouter votre propre méthode nommée scrollTo(). Pour une raison ma propre méthode de scrollTo() était invoquée quand j'ai appelé window.scrollTo().

Donc, en résumé, pour faire défiler une WebView à un élément DOM particulier, écrire une fonction JavaScript 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 de votre application Android (code Java), dites à votre WebView pour charger une URL:

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

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

L'objet fenêtre DOM fait rapport la position de défilement actuelle du WebView correctement (voir window.pageXOffset, window.pageYOffset ou window.scrollX, window.scrollY). Si vous voulez juste connaître la position de défilement actuelle du WebView, écrire un peu de JavaScript pour appeler votre code Java et transmettre les décalages X / Y.

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

Pour alls qui sont coincés à ce problème, j'ai une conclusion sur le défilement d'une WebView dans Android.

  • Vous ne pouvez pas faire défiler une WebView ou obtenir la position de défilement à l'aide du code Java.
  • Vous ne pouvez obtenir layoutHeight, measuredHeight, contentHeight d'une WebView, rien de plus. Ce sont tous les api Android vous permettant de faire en obtenir et de définir l'état de défilement.
  • Mais, vous pouvez remplacer le onScorllChanged d'ajouter un écouteur d'auto-définir pour le défilement événement WebView (ou un événement Fling), vous serez informé de la position d'origine et la nouvelle position.
  • Eh bien, vous pouvez faire défiler une position en utilisant le code JavaScript, comme suit, mais la performance est vraiment pauvre. Si vous voulez le faire défiler souvent, s'il vous plaît donner une seconde pensée.
      

    window.scrollTo (100500)

Tenez compte de votre situation et choisir une solution appropriée. être aussi remarqué que Fling et défilement sont des choses différentes.

    @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);


    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top