WebView verwendet häufig übersehene Punkte

1.WebView verwendet
1.webview: verantwortlich für die Seitendarstellung
2.WebViewClient: unterstützt WebView bei der Verarbeitung verschiedener Benachrichtigungen und Anforderungsereignisse
3.WebChromeClient: unterstützt WebView bei der Verarbeitung von Dialogfeldern in JavaScript, URL-Symbolen und -Titeln, Fortschrittsbalken usw.
Details:
Wenn wir die Sprungmethoden verschiedener Links steuern möchten, müssen wir WebViewClient erben und die Methode ShouldOverrideUrlLoading () neu schreiben

Zwei Hinweise zur Methode ShouldOverrideUrlLoading():

1 Methodenrückgabewert

Rückgabe true: Das Android-System verarbeitet die URL, normalerweise um den Systembrowser aufzurufen.
Gibt false zurück: Die aktuelle WebView verarbeitet die URL.

Da es standardmäßig auf „false“ zurückgesetzt ist, müssen wir nur mWebView.setWebViewClient(new WebViewClient()) festlegen, wenn wir nur Linksprünge in WebView verarbeiten möchten.

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

webView.setWebViewClient(new WebViewClient());

url存在重定向,无法回退

shouldOverrideUrlLoading(WebView view, String url)

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

Problem mit der veralteten Methode 2

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

Die Methode ShouldOverrideUrlLoading() wird als veraltet markiert, wenn API >= 24, ihre Alternative ist

3. Seiten-Fallback

Mit der Rückgabetaste von Android können Sie die onKeyEvent()-Methode überschreiben, wenn Sie die Webseite in WebView zurückgeben möchten.

4 Seitengleiten
Drei Methoden zur Beurteilung der Höhe:

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. WebView-Cache-Implementierung

Wenn die HTML-Seite geladen wird, werden zwei Ordner, Datenbank und Cache, im Verzeichnis /data/data/package name generiert.

Der angeforderte URL-Datensatz wird in WebViewCache.db gespeichert
und der Inhalt der URL wird im WebViewCache-Ordner gespeichert

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

Cache leeren

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

3. WebView-Zugriff auf lokale Ressourcen
Wenn wir den Inhalt vom Webserver in WebView laden, können wir nicht auf lokale Ressourcen wie Bildressourcen im Assets-Verzeichnis zugreifen, da es sich bei diesem Verhalten um ein domänenübergreifendes Verhalten (Cross-Domain) handelt WebView ist verboten
. Die Lösung für dieses Problem besteht darin, zuerst den HTML-Inhalt lokal herunterzuladen und dann LoadDataWithBaseURL zum Laden des HTML zu verwenden. Auf diese Weise kann der Link „file:///android_asset/xxx.png“ in HTML verwendet werden, um auf
die Ressourcen unter „Assets“ im Paket zu verweisen.

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. Der Unterschied zwischen WebView LoadUrl und Reload

LoadUrl verfügt über eine Cache-Richtlinie und wird nicht aktualisiert, wenn auf eine Webseite mit # gestoßen wird. Durch Neuladen wird unabhängig von der Cache-Richtlinie eine Aktualisierung erzwungen.
Die beiden vorherigen wurden jedoch nach dem Experimentieren im Projekt nicht wirksam. Ändern Sie zu: webview.loadUrl(“javascript:window.location.reload(true)”); werden wirksam. Das spezifische Prinzip muss untersucht werden 5.WebView
clearHistory () wird nicht wirksam

Der Grund für diese Situation liegt darin, dass beim Laden von URL die neue Seite nicht vollständig geladen wurde und „clearHistory“ nicht funktioniert, da sich mindestens eine Seite oben befinden muss, sodass die vorherige Seite nicht entfernt wurde. Um dieses Problem zu lösen, können Sie die Methode „clearHistory“ zur Methode „onPageFinished“ hinzufügen oder die Methode „clearHistory“ mit einer Verzögerung aufrufen.

Ich denke du magst

Origin blog.csdn.net/github_37610197/article/details/128727521
Empfohlen
Rangfolge