WebView utiliza puntos comunes que se pasan por alto

1. Usos de WebView
1. Webview: responsable de la representación de la página
2. WebViewClient: ayuda a WebView a manejar varias notificaciones y solicita eventos
3. WebChromeClient: ayuda a WebView a manejar cuadros de diálogo en JavaScript, iconos y títulos de URL, barras de progreso, etc.
Detalles:
Si queremos controlar los métodos de salto de diferentes enlaces, necesitamos heredar WebViewClient y reescribir el método shouldOverrideUrlLoading()

Dos notas sobre el método shouldOverrideUrlLoading():

1 valor de retorno de método

Retorna verdadero: el sistema Android procesará la URL, generalmente para invocar el navegador del sistema.
Devuelve falso: el WebView actual maneja la URL.

Dado que se establece de nuevo en falso de forma predeterminada, si solo queremos manejar los saltos de enlace en WebView, solo necesitamos configurar mWebView.setWebViewClient (nuevo WebViewClient ())

注意:
如果你只需要避免启动系统浏览器来加载页面的情况,只需要这么写就可以了

webView.setWebViewClient(new WebViewClient());

url存在重定向,无法回退

shouldOverrideUrlLoading(WebView view, String url)

的返回值决定了webview是否自动处理该url,也就是是否加载。当返回true时,由程序处理,当返回false时,webview会自己处理,也就是相当于自动执行了loadUrl方法。

Problema obsoleto de 2 métodos

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        view.loadUrl(request.toString());
        return true;
    }

El método shouldOverrideUrlLoading() se marca como obsoleto cuando API >= 24, su alternativa es

3. Reserva de página

Tecla de retorno de Android, si desea devolver la página web en WebView, puede anular el método onKeyEvent().

4 Deslizamiento de página
Tres métodos para juzgar la altura:

1.getScrollY():该方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.
2.getHeight();
getBottom();
该方法都返回当前WebView这个容器的高度

3.getContentHeight();:
返回的是整个html的高度, 但并不等同于当前整个页面的高度, 因为WebView有缩放功能, 所以当前整个页面的高度实际上应该是原始html的高度:

if (webView.getContentHeight() * webView.getScale() == (webView.getHeight() + webView.getScrollY())) {
    //已经处于底端
}

if(webView.getScrollY() == 0){
    //处于顶端
}

 不过从API 17开始, mWebView.getScale()被标记为deprecated
public class CustomWebView extends WebView {

public CustomWebView(Context context) {
    super(context);
    setWebViewClient(new WebViewClient() {
        @Override
        public void onScaleChanged(WebView view, float oldScale, float newScale) {
            super.onScaleChanged(view, oldScale, newScale);
            mCurrentScale = newScale
        }
    });
}


2. Implementación de caché de WebView

Cuando se carga la página html, se generarán dos carpetas, base de datos y caché, en el directorio de nombre /data/data/package.

El registro de URL solicitado se guarda en WebViewCache.db
y el contenido de la URL se guarda en la carpeta WebViewCache

控制缓存行为的相关API:
WebSettings webSettings = mWebView.getSettings();
//优先使用缓存
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
//只在缓存中读取
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
/不使用缓存
WwebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

limpiar cache

clearCache(true); //清除网页访问留下的缓存,由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
clearHistory (); //清除当前webview访问的历史记录,只会webview访问历史记录里的所有记录除了当前访问记录.
clearFormData () //这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据。

3. Acceso a recursos locales de WebView
Cuando cargamos el contenido tomado del servidor web en WebView, no podemos acceder a los recursos locales, como los recursos de imagen en el directorio de activos, porque tal comportamiento es un comportamiento de dominio cruzado (Cross-Domain), mientras que WebView está prohibido
. La solución a este problema es descargar primero el contenido html al local y luego usar loadDataWithBaseURL para cargar el html. De esta manera, el enlace de file:///android_asset/xxx.png se puede usar en html para hacer referencia a
los recursos en activos en el paquete.

private void loadWithAccessLocal(final String htmlUrl) {
    new Thread(new Runnable() {
        public void run() {
            try {
                final String htmlStr = NetService.fetchHtml(htmlUrl);
                if (htmlStr != null) {
                    TaskExecutor.runTaskOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            loadDataWithBaseURL(htmlUrl, htmlStr, "text/html", "UTF-8", "");
                        }
                    });
                    return;
                }
            } catch (Exception e) {
                Log.e("Exception:" + e.getMessage());
            }

            TaskExecutor.runTaskOnUiThread(new Runnable() {
                @Override
                public void run() {
                    onPageLoadedError(-1, "fetch html failed");
                }
            });
        }
    }).start();
}

4. La diferencia entre WebView loadUrl y reload

loadUrl tendrá una política de caché y no se actualizará cuando encuentre una página web con #, y reload forzará una actualización independientemente de la política de caché.
Sin embargo, los dos anteriores no tuvieron efecto después de experimentar en el proyecto. Cambie a: webview.loadUrl(“javascript:window.location.reload(true)”); surtan efecto. El principio específico se estudiará 5.WebView
clearHistory () no tiene efecto

El motivo de esta situación es que cuando loadUrl, debido a que la nueva página no se ha cargado por completo, clearHistory no funciona, porque al menos una página debe estar en la parte superior, por lo que la página anterior no se ha eliminado. Para resolver este problema, puede agregar el método clearHistory en el método onPageFinished o llamar al método clearHistory con un retraso.

Supongo que te gusta

Origin blog.csdn.net/github_37610197/article/details/128727521
Recomendado
Clasificación