Android WebView不应为无效链接调用OverrideUrlLoading()
HTML文件中有两种类型的链接: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
(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://" );