Как программно прокрутить Android WebView - PullRequest
26 голосов
/ 10 февраля 2010

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

Ответы [ 4 ]

47 голосов
/ 19 февраля 2010

Я нашел лучший ответ на этот вопрос. Оказывается, у WebView есть методы scrollTo(), getScrollX() и getScrollY(), как и следовало ожидать. Они немного скрыты в документации, потому что они наследуются от View (через AbsoluteLayout -> ViewGroup -> View). Это, очевидно, лучший способ манипулировать позицией прокрутки WebView, чем несколько громоздкий интерфейс JavaScript.

13 голосов
/ 10 февраля 2010

Оказывается, что window.scrollTo() работает, вы просто не можете добавить свой собственный метод с именем 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) скажите WebView загрузить URL-адрес:

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

Есть некоторые проблемы с этим подходом, такие как прокрутка не будет хорошо анимирована, но общий механизм работает.

Объект окна DOM правильно сообщает текущую позицию прокрутки WebView (см. window.pageXOffset, window.pageYOffset или window.scrollX, window.scrollY). Если вы просто хотите узнать текущую позицию прокрутки WebView, напишите немного JavaScript для вызова вашего Java-кода и передачи смещений X / Y.

0 голосов
/ 08 апреля 2016
    @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 голосов
/ 26 октября 2015

Вы не можете сделать это с помощью Java Code .

Для всех, кто застрял в этой проблеме, у меня есть некоторые выводы о прокрутке веб-просмотра в Android.

  • Вы не можете прокрутить веб-просмотр или получить позицию прокрутки, используя Java-код.
  • Вы можете получить только layoutHeight, измеренныйHeight, contentHeight веб-просмотра и ничего более. Это все Android API, позволяющие вам получить и установить статус прокрутки.
  • Но вы можете переопределить onScorllChanged, чтобы добавить самоопределяемый прослушиватель для прокрутки события веб-просмотра (или события броска), вы будете уведомлены об исходной позиции и новой позиции.
  • Хорошо, вы можете прокрутить до позиции, используя код JavaScript, как показано ниже, но производительность действительно низкая. Если вы хотите прокручивать его часто, подумайте еще раз.

    window.scrollTo (100,500)

Рассмотрите ситуацию и выберите правильное решение. Также обратите внимание, что кидание и прокрутка - разные вещи.

...