WebView scrollTo не работает - PullRequest
       1

WebView scrollTo не работает

9 голосов
/ 22 февраля 2012

Я пытаюсь использовать метод веб-просмотра scrollTo.Это мой файл макета для веб-просмотра.

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout  
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:orientation="vertical"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent"   
>  
<WebView  
   android:id="@+id/webMap"  
   android:layout_width="fill_parent"  
   android:layout_height="fill_parent"  
 />  
</LinearLayout> 

Я пытаюсь показать html-файл (в котором есть только изображение карты) и прокрутить до определенной области изображения с помощью:

mapWebView.loadUrl("file:///android_asset/maps/map.html");
mapWebView.scrollTo(300, 300);

Но когда веб-просмотр загружен, он всегда показывает (0, 0) изображения.

В чем проблема scrollTo() здесь?

Ответы [ 4 ]

16 голосов
/ 22 февраля 2012

Я подозреваю, что mapWebView.loadUrl("file:///android_asset/maps/map.html"); является асинхронным, поэтому mapWebView.scrollTo(300, 300); выполняется до завершения загрузки веб-просмотра.Как только страница загрузится, она потеряет настройку прокрутки, которую вы применили, и вернется к началу.

Вам нужно прослушать загрузку страницы и затем прокрутить ее:

mapWebView.setWebViewClient(new WebViewClient(){

        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
            mapWebView.scrollTo(300, 300);
        }

    }
    );

Надеюсь, это поможет

РЕДАКТИРОВАТЬ: Оказывается, это ненадежно, используйте вместо этого:

mapWebView.setPictureListener(new PictureListener() {

        @Override
        public void onNewPicture(WebView view, Picture picture) {
             mapWebView.scrollTo(300, 300);

        }
    });
2 голосов
/ 22 февраля 2012

Попробуйте это ..:

 try {
webview.setWebChromeClient(new WebChromeClient() {

    @Override
    public void onProgressChanged(WebView view,
            int newProgress) {

        if (newProgress >= 100) {

            webview.scrollTo(x,y);
        }

        super.onProgressChanged(view, newProgress);
    };

});
} catch (Exception e) {
e.printStackTrace();
}
0 голосов
/ 05 января 2019
MyViewClient myViewClient = new MyViewClient();


    // Обработка переворачивания экрана и начальная инициализация выбранной темы (ID_TOPIC) в приложении
    if (savedInstanceState != null) {
        // Вторичное создание окна после переворачивания экрана
        scrollTopic = savedInstanceState.getFloat(SCROOL_TOPIC, 0);
    } else {
        // Первый запуск программы до переворачивания экрана
        // Чтение данных с настроек программы
        scrollTopic = sPref.getFloat(SCROOL_TOPIC, 0);
    }

    webView.setWebViewClient(myViewClient);


// Сохранение данных в буфер при переворачивании экрана
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putFloat(SCROOL_TOPIC, getScrollWebView()); // Сохраняем вертикальную прокрутку
    super.onSaveInstanceState(savedInstanceState);
}

// Метод при закрытии окна
@Override
protected void onStop() {
    super.onStop();
    // Сохранение настроек программы в файл настроек
    SharedPreferences.Editor ed = sPref.edit();
    ed.putFloat(SCROOL_TOPIC, getScrollWebView());
    ed.apply();
}

// Класс собственного загрузчика html
public class MyViewClient extends WebViewClient {
    // Переопределение метода окончания загрузки страницы
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        setScrolling();
    }
}

// Установка нужной прокрутки в нашем webView
private void setScrolling() {
    final WebView newView = webView;
    try {
        if (scrollTopic > 0) {
            newView.postDelayed(new Runnable() {
                public void run() {
                    if (newView.getProgress() >= 100) {
                        newView.postDelayed(new Runnable() {
                            public void run() {
                                newView.scrollTo(0, (int) getScrollingFromPercentage());
                                scrollTopic = 0;
                            }
                        }, 10);
                    } else {
                        newView.post(this);
                    }
                }
            }, 1000);
        }
    } catch (Exception ignored) {
    }
}

// Определение процента прокрутки (без умножения на 100)
private float getScrollWebView() {
    return (float) (webView.getScrollY() - webView.getTop()) / webView.getContentHeight();
}

// Определение прокрутки по проценту (без деления на 100)
private float getScrollingFromPercentage() {
    return webView.getTop() + scrollTopic * webView.getContentHeight();
}
0 голосов
/ 22 января 2013

У меня лучше работает следующее переопределение.

 protected void onLayout(boolean changed, int l, int t, int r, int b) {
 // set initial scroll to
 scrollTo(yourXpos,yourYpos);
 super.onLayout(changed, l, t, r, b);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...