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

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

<?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);

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

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

3 ответов


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

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

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);
        }

    }
    );

надеюсь, что это помогает

EDIT: оказывается, это ненадежно, используйте это вместо этого:

mapWebView.setPictureListener(new PictureListener() {

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

        }
    });

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

 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();
}

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

 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);
 }