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?
Ich habe eine bessere Antwort auf dieses Problem gefunden. Es stellt sich heraus, dass WebView
die Funktionen scrollTo()
, getScrollX()
und getScrollY()
wie erwartet hat. Sie sind in der Dokumentation etwas versteckt, da sie von View
(über AbsoluteLayout
-> ViewGroup
-> View
name__) geerbt werden. Dies ist offensichtlich eine bessere Möglichkeit, die Bildlaufposition von WebView
name __ zu ändern, als die etwas umständliche JavaScript-Schnittstelle.
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.
@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);
}
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.
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.