我正在尝试使用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()
有什么问题?
答案 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()")
}