WebView scrollTo is not working
Try this..:
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();
}
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();
}
I suspect that mapWebView.loadUrl("file:///android_asset/maps/map.html");
is asynchronous, so mapWebView.scrollTo(300, 300);
executes before the webview has finished loading. Once the page loads it will have lost the scroll setting you applied and will be reset to the top.
You need to listen in for the the page loading and then scroll it:
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);
}
}
);
Hope this helps
EDIT: Turns out this is unreliable, use this instead:
mapWebView.setPictureListener(new PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
mapWebView.scrollTo(300, 300);
}
});