wake-up-neo.com

So programmieren Sie Android WebView programmgesteuert

Ich versuche, ein WebView programmgesteuert an die Position eines bestimmten Elements in der DOM-Struktur zu rollen. Bisher konnte ich jedoch nicht, dass das WebView auf Bildlaufanfragen reagiert. Ich habe versucht, JavaScript aufzurufen, das window.scrollTo(...) verwendet, aber die WebView reagiert nicht. Auf Java-Seite habe ich versucht, die WebView.flingScroll(...)-Methode aufzurufen. WebView reagiert auf flingScroll, aber was ich brauche, ist eine scrollTo(...)-Funktion. Irgendwelche Ideen?

25
Steve Liddle

Ich habe eine bessere Antwort auf dieses Problem gefunden. Es stellt sich heraus, dass WebViewdie Funktionen scrollTo(), getScrollX() und getScrollY() wie erwartet hat. Sie sind in der Dokumentation etwas versteckt, da sie von View(über AbsoluteLayout-> ViewGroup-> Viewname__) geerbt werden. Dies ist offensichtlich eine bessere Möglichkeit, die Bildlaufposition von WebViewname __ zu ändern, als die etwas umständliche JavaScript-Schnittstelle.

47
Steve Liddle

Es stellt sich heraus, dass die Funktion window.scrollTo() funktioniert. Sie können einfach keine eigene Methode mit dem Namen scrollTo() hinzufügen. Aus irgendeinem Grund wurde meine eigene scrollTo()-Methode aufgerufen, als ich window.scrollTo() aufrief.

Um also eine WebView zu einem bestimmten DOM-Element zu scrollen, schreiben Sie eine JavaScript-Funktion, um das Scrollen durchzuführen:

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

und dann von Ihrer Android-App (Java-Code) aus, dass Ihr WebView eine URL lädt:

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

Bei diesem Ansatz gibt es einige Probleme, z. B. wird der Bildlauf nicht schön animiert, der allgemeine Mechanismus funktioniert jedoch.

Das DOM-Fensterobjekt meldet die aktuelle Bildlaufposition des WebView korrekt (siehe window.pageXOffset, window.pageYOffset oder window.scrollX, window.scrollY)). Wenn Sie nur die aktuelle Bildlaufposition des WebView wissen möchten, schreiben Sie JavaScript, um den Java-Code aufzurufen und den Java-Code abzurufen X/Y-Verschiebungen.

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

Das kann man nicht mit Java Code machen .

Für alle, die an diesem Problem festhalten, habe ich einige Schlussfolgerungen zum Scrollen eines Webview in Android.

  • Mit Java-Code können Sie keine Webansicht scrollen oder eine Bildlaufposition abrufen.
  • Sie können nur layoutHeight, gemessenHöhe, InhaltHöhe einer Webansicht erhalten, mehr nicht. Dies sind alle Android-APIs, mit denen Sie den Scroll-Status abrufen und einstellen können.
  • Sie können das onScorllChanged jedoch überschreiben, um einen selbstdefinierten Listener für das Webview-Ereignis (oder Fling-Ereignis) für das Scrollen hinzuzufügen. Sie erhalten eine Benachrichtigung über die Origin-Position und die neue Position.
  • Nun, Sie können mit JavaScript-Code wie folgt zu einer Position scrollen, aber die Leistung ist wirklich schlecht. Wenn Sie häufig scrollen möchten, denken Sie bitte darüber nach.

    window.scrollTo (100.500) 

Betrachten Sie Ihre Situation und wählen Sie eine geeignete Lösung. Beachten Sie auch, dass Fling und Scroll verschiedene Dinge sind.

0
York