WebView scrollTo无效

时间:2012-02-22 09:20:40

标签: android android-webview

我正在尝试使用webview的scrollTo方法。这是我对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()有什么问题?

5 个答案:

答案 0 :(得分:16)

我怀疑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);
        }

    }
    );

希望这有帮助

编辑:结果证明这是不可靠的,请改用:

mapWebView.setPictureListener(new PictureListener() {

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

        }
    });

答案 1 :(得分:2)

试试这个..:

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

答案 2 :(得分:0)

以下覆盖对我来说效果更好。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这有点麻烦,但是可以。在onPageFinished中将javascript与DOM结合使用以描述您要从哪里开始。我最初实现它是为了在页面加载后移动到指定的锚点。如果没有锚点,则需要它到页面顶部,因此我只需要查找“ html”标记。

        //Perform operations when page finishes loading
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
            if (anchor != null)
                webHelp.loadUrl("javascript:document.getElementById(\"$anchor\").scrollIntoView()")
            else
                webHelp.loadUrl("javascript:document.getElementsByTagName(\"html\")[0].scrollIntoView()")
        }