Подтвердить что ты не робот

Как программировать прокрутку Android WebView

Я пытаюсь программно прокрутить WebView к местоположению определенного элемента в дереве DOM. Но пока мне не удалось заставить WebView отвечать на запросы прокрутки. Я пробовал использовать JavaScript, который использует window.scrollTo(...), но WebView не отвечает. На стороне Java я попытался вызвать метод WebView.flingScroll(...). WebView ответит на flingScroll, но мне нужна возможность scrollTo(...). Любые идеи?

4b9b3361

Ответ 1

Я нашел лучший ответ на этот вопрос. Оказывается, что WebView имеет методы scrollTo(), getScrollX() и getScrollY(), как вы ожидали. Они немного скрыты в документации, потому что они унаследованы от View (через AbsoluteLayoutViewGroupView). Это, очевидно, лучший способ манипулировать положением прокрутки 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);


    }