我一直在为许多拥有移动网站的公司开发混合应用程序。 事实上,有些网站是使用jsp制作的。
我已经知道iframe和javascripts xhr请求不会触发webViewClient的shouldOverrideUrlLoading覆盖函数。我很好。
但今天我学会了一些行动,如:
不会总是触发此功能。
因此,当要求webView加载无法加载的页面(即“intent:// ...”)时,shouldOverrideUrlLoading()不会触发,它会显示错误页面。
有没有人遇到过这种行为,有没有解决办法?
下面是我用来调用活动的代码,其中带有'intent:'协议的URL(由于执行上述操作时此函数永远不会被调用,因此会失败)
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// ... omitted ...
if ( url.startsWith("intent:") ) {
Intent intent = null;
try {
intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
// The following flags launch the app outside the current app
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
try {
getActivity().startActivity(intent);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
return true;
}
}
PS。请注意,每个其他网站的页面加载将完美地调用shouldOverrideUrlLoading()。 我在android webViews上找不到任何JSP相关的错误,所以我问一个。
PS。我很乐意提供一些优秀的读者会尝试的样本网站..但网站上用韩文写的,所以我怀疑它会有所帮助。
谢谢!
答案 0 :(得分:0)
您的问题可能与JSP不相关,真正的问题可能是shouldOverrideUrlLoading()
本身。在这种情况下,使用shouldOverrideUrlLoading()
可能不是一个好主意,那么为什么不尝试其他观点呢?
shouldOverrideUrlLoading()
正在加载XmlHttpRequest。最后,我
使用onProgressChanged()
提出了这个想法,并解决了所有问题
我的问题。我已经写了一个类似的答案here。我尝试将您的代码添加到我自己的webview项目中,并在一些JSP网站上对其进行了测试,看起来它始终可以正常工作。在调用其他活动之后,我还添加了loadUrl()
,因此在按返回按钮后,将不再显示加载错误页面。所以试试这个:
首先声明一个全局变量以存储最后一个URL。
String strLastUrl = null;
然后重写onProgressChanged(WebView视图,int进度)
mWebView.setWebChromeClient(new MyWebChromeClient(){
@Override
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
//A fully loaded url will come here
String StrNewUrl = view.getUrl();
if(TextUtils.equals(StrNewUrl,strLastUrl)){
//same page was reloaded, not doing anything
}else{
String strOldUrl = null;
//save old url to variable strOldUrl before overwriting it
strOldURL = strLastUrl;
//a new page was loaded,overwrite this new url to variable
strLastUrl = StrNewUrl;
if ( strLastUrl.startsWith("intent:") ) {
Log.d("TAG", "intent triggered");
Intent intent = null;
try {
intent = Intent.parseUri(strLastUrl, Intent.URI_INTENT_SCHEME);
// The following flags launch the app outside the current app
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
//reload the page before invoking other activities
view.loadUrl(strOldURL);
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
}
super.onProgressChanged(view, progress);
}
});