WebView shouldOverrideUrlLoading()未调用无效链接

时间:2014-04-25 16:21:42

标签: android android-webview

HTML文件中有两种类型的链接:

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

对于第一种,只需加载网址即可。对于第二种类型,我应该在加载网址之前使用固定地址http://www.abc.com作为前缀。

我试图通过覆盖WebViewClient中的shouldOverrideUrlLoading()函数来做到这一点。但是,对于第二种类型的链接,不会调用此函数。我试过预先加上" http://www.abc.com"到HTML文件中的第二种类型的链接。然后当我点击第二种链接时,会调用该函数。

我认为发生的事情是WebView将首先检查链接是否是有效网址。只有它有效才会调用该函数。我对吗?我怎么解决这个问题?提前谢谢。

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

更多相关内容:

我尝试过更改

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

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

然后调用该函数。

如果我手动将短链接更改为html字符串中的完整链接。然后该函数也被调用。

所以我认为这可能是发生的事情:WebView检查链接URL是否有效。只有当URL有效时才会调用shouldOverrideUrlLoading()。

6 个答案:

答案 0 :(得分:12)

您可能正在使用KitKat WebView。这是一个已知问题(我认为在迁移指南中已经概述了这个问题),无法根据基本网址解析的网址会被丢弃(您无法获得任何回调) ,既不应该是OverOrlLoading也不是onPageStarted)。

问题是您的基本网址是一个数据网址,因此您要尝试解析' / q?type = short'反对'数据:text / html,...'这没有多大意义,因此导航到URL的整个尝试都会被忽略。

对于使用KURL而不是GURL进行URL处理的pre-KK WebView,这是不同的。 GURL通常比KURL更严格(也更安全),这是两个WebView版本之间不兼容的原因。

答案 1 :(得分:8)

也许尝试使用onPageStarted方法

答案 2 :(得分:6)

对我有用的解决方案是使用loadDataWithBaseURL和无效的baseUrl并检测并删除它并在setWebViewClient

中替换为“http://”
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) { }
    }
}

答案 3 :(得分:0)

我也遇到了这个问题并通过替换我的html响应来解决它。在我的html响应中,“href”html标签中没有任何主机。然后我按照代码替换它,现在就像魅力一样:)

        String htmlString = AppCache.homePageResponse.showcaase.replace("href=\"/", "href=\"" + "evidea://" );

答案 4 :(得分:-1)

我发现如果你的网页在iframe中运行,点击外部(http://www..。)链接就不会触发shouldOverrideUrlLoading()! 见shouldOverrideUrlLoading() not called for external links from iframe

答案 5 :(得分:-1)

试试这个

 private static WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); //should be activity_main

        webView = (WebView) findViewById(R.id.web);

        webView.setWebViewClient(new webviewclient());
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("http://www.yahoo.com");

    }
public class webviewclient extends WebViewClient{

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