Я пытаюсь программно прокрутить WebView к местоположению определенного элемента в дереве DOM. Но пока мне не удалось заставить WebView отвечать на запросы прокрутки. Я пробовал использовать JavaScript, который использует window.scrollTo(...)
, но WebView не отвечает. На стороне Java я попытался вызвать метод WebView.flingScroll(...)
. WebView ответит на flingScroll
, но мне нужна возможность scrollTo(...)
. Любые идеи?
Как программировать прокрутку Android WebView
Ответ 1
Я нашел лучший ответ на этот вопрос. Оказывается, что WebView
имеет методы scrollTo()
, getScrollX()
и getScrollY()
, как вы ожидали. Они немного скрыты в документации, потому что они унаследованы от View
(через AbsoluteLayout
→ ViewGroup
→ View
). Это, очевидно, лучший способ манипулировать положением прокрутки WebView
, чем несколько громоздкий интерфейс JavaScript.
Ответ 2
Оказывается, работают window.scrollTo()
DOES, вы просто не можете добавить свой собственный метод с именем scrollTo()
. По какой-то причине мой собственный метод scrollTo()
вызывался, когда я вызывал window.scrollTo()
.
Итак, в общем, для прокрутки WebView к определенному элементу DOM напишите функцию JavaScript
для прокрутки:
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);
}
а затем из вашего приложения Android (код Java) скажите веб-браузеру загрузить URL-адрес:
webView.loadUrl("javascript:scrollToElement('" + elemId + "')");
Есть некоторые проблемы с этим подходом, например, прокрутка не будет хорошо анимирована, но работает общий механизм.
Объект окна DOM правильно сообщает текущую позицию прокрутки WebView (см. window.pageXOffset
, window.pageYOffset
или window.scrollX
, window.scrollY)
). Если вам просто нужно знать текущую позицию прокрутки WebView, напишите некоторый JavaScript для вызова вашего Java-кода и передачи по смещениям X/Y.
Ответ 3
Вы не можете сделать это с помощью Java Code.
Для всех, кто застрял в этой проблеме, у меня есть некоторый вывод о прокрутке webview в android.
- Вы не можете прокручивать веб-просмотр или получать прокручиваемую позицию с помощью кода Java.
- Вы можете получить только layoutHeight, measuredHeight, contentHeight webview, не более того. Это все андроид api, позволяющий вам получать и устанавливать статус прокрутки.
- Но вы можете переопределить onScorllChanged, чтобы добавить слушателя самоопределения для прокрутки события веб-просмотра (или события fling), вам будет отправлено уведомление о месте происхождения и новой позиции.
- Ну, вы можете прокручивать позицию с помощью кода JavaScript, как показано ниже, но производительность очень плохая. Если вы хотите часто прокручивать его, подумайте, подумайте.
window.scrollTo(100 500)
Рассмотрите свою ситуацию и выберите правильное решение. Также обратите внимание, что бросок и свиток - это разные вещи.
Ответ 4
@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);
}