Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android WebView不应为无效链接调用OverrideUrlLoading()_Android_Android Webview - Fatal编程技术网

Android WebView不应为无效链接调用OverrideUrlLoading()

Android WebView不应为无效链接调用OverrideUrlLoading(),android,android-webview,Android,Android Webview,HTML文件中有两种类型的链接: (1) A normal link like http://www.bbb.com/q?type=normal (2) A short link like /q?type=short. 对于第一种,只需加载url。对于第二种,我应该在它前面加上一个固定地址,就像加载url之前一样 我试图通过重写WebViewClient中的shouldOverrideUrlLoading()函数来实现这一点。但是,对于第二种类型的链接,不会调用此函数。我尝试将“”预先添加到H

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

(1) A normal link like http://www.bbb.com/q?type=normal
(2) A short link like /q?type=short.
对于第一种,只需加载url。对于第二种,我应该在它前面加上一个固定地址,就像加载url之前一样

我试图通过重写WebViewClient中的shouldOverrideUrlLoading()函数来实现这一点。但是,对于第二种类型的链接,不会调用此函数。我尝试将“”预先添加到HTML文件中的第二类链接。然后,当我单击第二种链接时,确实会调用该函数

我认为现在的情况是WebView将首先检查链接是否是有效的url。只有当它有效时,才会调用该函数。我说得对吗?我怎样才能解决这个问题?提前谢谢

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

然后调用该函数

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


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

可能尝试使用方法

您可能正在使用KitKat WebView。这是一个已知的问题(我认为它在迁移指南中有概述),其中无法根据基本URL解析的URL被丢弃在地板上(您不会得到任何回调,也不应该覆盖URL或onPageStarted)

问题是,您的基本URL是一个数据URL,因此您试图针对“data:text/html,…”解析“/q?type=short”,这没有多大意义,因此导航到URL的整个尝试被忽略


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

对我有效的解决方案是将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) { }
    }
}

我发现,如果您的页面在iframe中运行,单击外部(.)链接不会触发shouldOverrideUrlLoading()! 请参见试试这个

私有静态WebView-WebView;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//应该是activity_main
webView=(webView)findviewbyd(R.id.web);
setWebViewClient(新的webviewclient());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(“http://www.yahoo.com");
}
公共类webviewclient扩展了webviewclient{
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图、WebResourceRequest请求){
view.loadUrl(request.toString());
返回true;

}
我也遇到了这个问题,并通过替换我的html响应解决了这个问题。在我的html响应中,“href”html标记中没有任何主机。然后,我替换了以下代码,现在它工作得很好:)


您能给我们看一下您的shouldOverrideUrlLoading()实现的一些代码吗?@shkschneider代码已添加。但问题是,如果url无效,则无法调用该函数。编辑后请注意:是的,这正是发生的情况。尝试提供baseUrlMigration指南:那么如何解决此问题?使用target=“\u top with ifram
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) { }
    }
}
        String htmlString = AppCache.homePageResponse.showcaase.replace("href=\"/", "href=\"" + "evidea://" );