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()。
答案 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;
}