web-dev-qa-db-fra.com

WebView shouldOverrideUrlLoading () non appelé pour les liens non valides

Il existe deux types de liens dans le fichier HTML:

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

Pour le premier type, il suffit de charger l'URL. Pour le second type, je devrais ajouter une adresse fixe telle que http://www.abc.com avant de charger l’URL.

J'essaie de le faire en remplaçant la fonction shouldOverrideUrlLoading () dans WebViewClient. Cependant, cette fonction n'est pas appelée pour le deuxième type de lien. J'ai essayé de faire précéder " http://www.abc.com " du deuxième type de liens dans le fichier HTML. Ensuite, la fonction est appelée lorsque je clique sur le deuxième type de lien.

Je pense que ce qui se passe, c'est que WebView vérifie d'abord si le lien est une URL valide. La fonction n'est appelée que si elle est valide. Ai-je raison? Comment puis-je résoudre ça? Merci d'avance.

        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);

Plus sur ceci:

J'ai essayé de changer 

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

à

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

Ensuite, la fonction est appelée.

Si je change le lien court en un lien complet dans la chaîne HTML manuellement. Ensuite, la fonction est également appelée.

Je pense donc que c'est probablement ce qui se passe: la WebView vérifie si l'URL du lien est valide. Le shouldOverrideUrlLoading () sera appelé uniquement lorsque l'URL sera valide.

18
darklord

Vous utilisez probablement le KitKat WebView. Il s'agit d'un problème connu (je pense que cela est décrit dans le guide de migration), où les URL qui ne peuvent pas être résolues par rapport à l'URL de base sont abandonnées au sol (vous ne recevrez aucun rappel pour elles, ni shouldOverrideUrlLoading ni onPageStarted).

Le problème est que votre URL de base est une URL de données. Vous essayez donc de résoudre le problème '/ q? Type = short' contre 'data: text/html, ...', ce qui n'a pas beaucoup de sens et donc le tout tenter de naviguer vers l'URL est ignoré.

Cela était différent pour la version Web antérieure à KK qui utilisait KURL au lieu de GURL pour le traitement des URL. GURL est généralement plus strict (et plus sécurisé) que KURL, ce qui est à l’origine d’une incompatibilité entre les deux versions de WebView.

12
marcin.kosiba

Essayez peut-être avec onPageStarted method

7
michal.luszczuk

la solution qui fonctionnait pour moi consistait à utiliser loadDataWithBaseURL avec une baseUrl non valide, à la détecter, à la supprimer et à la remplacer par "http: //" pendant setWebViewClient.

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

j'ai aussi fait face à ce problème et l'ai résolu en remplaçant ma réponse HTML. Dans ma réponse HTML, il n'y a pas d'hôte dans les balises HTML "href". Ensuite, je l'ai remplacé en suivant les codes et ça fonctionne comme un charme maintenant :)

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