Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WebView scrollTo is not working

I'm trying to use scrollTo method of webview. This my layout file for the 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> 

What I'm trying to do is showing a html file (which has only a map image) and scrolling to certain area on image with :

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

But when the webview is loaded it always shows the (0, 0) of the image.

What is the problem with scrollTo() here?

like image 363
penguru Avatar asked Feb 22 '12 09:02

penguru


People also ask

Is Android WebView deprecated?

The Android system webview custom cache file has been deprecated and removed in Android 13. New apps and any app updates will now use the operating system default cache location.

How do I view WebView?

Create two Android layout files – “res/layout/main. xml” and “res/layout/webview. xml“. Two activity classes, an activity to display a button, another activity display the WebView with predefined URL.

What is WebView process?

Android System WebView lets applications display browser windows in an app instead of transporting the user to another browser. Android developers use WebView when they want to display webpages in a Google app or other application.


2 Answers

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();
}
like image 171
Сергей Талипов Avatar answered Oct 06 '22 12:10

Сергей Талипов


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();
}
like image 26
Awais Tariq Avatar answered Oct 06 '22 14:10

Awais Tariq