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?
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.
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.
@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);
}
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.
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.