web-dev-qa-db-de.com

WebView shouldOverrideUrlLoading () wird nicht für ungültige Links aufgerufen

In der HTML-Datei gibt es zwei Arten von Links:

(1) A normal link like http://www.bbb.com/q?type=normal
(2) A short link like /q?type=short.

Für die erste Art laden Sie einfach die URL. Für die zweite Art sollte ich eine feste Adresse wie http://www.abc.com vor dem Laden der URL angeben.

Ich versuche dies mit dem Überschreiben der shouldOverrideUrlLoading () - Funktion in WebViewClient. Diese Funktion wird jedoch nicht für den zweiten Link-Typ aufgerufen. Ich habe versucht, " http://www.abc.com " der zweiten Art von Links in der HTML-Datei voranzustellen. Dann wird die Funktion aufgerufen, wenn ich auf die zweite Art von Link klicke.

Ich denke, was passiert, ist, dass WebView zuerst prüft, ob der Link eine gültige URL ist. Nur wenn es gültig ist, wird die Funktion aufgerufen. Habe ich recht? Wie kann ich das lösen? Danke im Voraus.

        contentWebView = new WebView(context);

        webViewClient = new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // String not in Logger.
                Log.d(TAG, "Here!");
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                context.startActivity(intent);
                return true;
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                if (hosted) {
                    contentWebView.setVisibility(VISIBLE);
                } else {
                    summaryTextView.setVisibility(VISIBLE);
                    articleLinkButton.setVisibility(VISIBLE);
                }

                progressBar.setVisibility(View.GONE);
            }
        };

        contentWebView.setWebViewClient(webViewClient);
        contentWebView.getSettings().setJavaScriptEnabled(true);
        contentWebView.loadData(fullString, "text/html", "utf-8");
        contentWebView.setVisibility(GONE);

Mehr dazu:

Ich habe versucht, mich zu ändern 

contentWebView.loadData(fullString, "text/html", "utf-8");

zu

contentWebView.loadDataWithBaseURL("http://www.abc.com", fullString, "text/html", "utf-8", null);

Dann wird die Funktion aufgerufen.

Wenn ich den kurzen Link manuell in einen vollständigen Link in der HTML-Zeichenfolge umwandle. Dann wird auch die Funktion aufgerufen.

Ich denke, dass dies wahrscheinlich der Fall ist: Das WebView prüft, ob die Link-URL gültig ist. Nur wenn die URL gültig ist, wird das shouldOverrideUrlLoading () aufgerufen.

18
darklord

Sie verwenden wahrscheinlich das KitKat WebView. Dies ist ein bekanntes Problem (ich denke, es ist im Migrationsleitfaden beschrieben), bei dem URLs, die nicht anhand der Basis-URL aufgelöst werden können, auf dem Boden abgelegt werden (Sie erhalten keine Rückrufe für sie, weder sollteOverrideUrlLoading noch onPageStarted).

Das Problem ist, dass Ihre Basis-URL eine Daten-URL ist. Sie versuchen also, '/ q? Type = short' gegen 'data: text/html, ...' aufzulösen Der Versuch, zur URL zu navigieren, wird ignoriert.

Dies war für das WebView vor KK, das KURL anstelle von GURL für die URL-Verarbeitung verwendete, unterschiedlich. GURL ist im Allgemeinen strenger (und sicherer) als KURL, was zu einer Inkompatibilität der beiden WebView-Versionen führt.

12
marcin.kosiba

Vielleicht versuchen Sie es mit onPageStarted

7
michal.luszczuk

die Lösung, die für mich funktionierte, bestand darin, loadDataWithBaseURL mit einer ungültigen baseUrl zu verwenden, diese zu ermitteln und zu entfernen und durch "http: //" während setWebViewClient zu ersetzen

public class MyActivity
    extends Activity
{
    private static final String badurl = "http://myappname.invalid/";

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ...
        WebView wv = ((WebView)findViewById(R.id.webview));
        WebSettings settings = wv.getSettings();
        settings.setJavaScriptEnabled(false);
        settings.setSupportMultipleWindows(true);
        wv.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)
            {
                handleUrlview.getHitTestResult().getExtra());
                return true;
            }
        });
        wv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) 
            {
                handleUrl(url);
                return true;
            }
        });
        wv.loadDataWithBaseURL(badurl,text,"text/html","utf-8",null);
    }

    private void handleUrl(String url)
    {
        if (url.startsWith(badurl))
            url = "http://"+url.substring(badurl.length());
        try {
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        } catch (ActivityNotFoundException e) { }
    }
}
6
SteelBytes

ich stand auch vor diesem Problem und löste es, indem ich meine HTML-Antwort ersetzte. In meiner HTML-Antwort gibt es keinen Host in "href" -Html-Tags. Dann habe ich es durch folgende Codes ersetzt und das funktioniert jetzt wie ein Zauber :)

        String htmlString = AppCache.homePageResponse.showcaase.replace("href=\"/", "href=\"" + "evidea://" );
0
Ali Gürelli