Android WebView加载网页链接遇到的那些坑
Android WebView加载网页链接遇到的那些坑本来觉得十分简单的问题,结果遇到了不少坑,到现在都不敢保证不出问题,只是解决了大部分问题。。。下面是列出几个问题在webview中跳转别的页面无响应在webview中下载文件无响应部分网址链接无法显示部分网址打开自动跳转到浏览器1.在webview中跳转别的页面无响应修改之前代码如下:WebSet...
Android WebView加载网页链接遇到的那些坑
本来觉得十分简单的问题,结果遇到了不少坑,到现在都不敢保证不出问题,只是解决了大部分问题。。。
下面是列出几个问题
- 在webview中跳转别的页面无响应
- 在webview中下载文件无响应
- 部分网址链接无法显示
- 部分网址打开自动跳转到浏览器
1.在webview中跳转别的页面无响应
修改之前代码如下:
WebSettings webSettings = webView.getSettings();
//设置WebView属性,能够执行Javascript脚本
webSettings.setJavaScriptEnabled(true);
//设置可以访问文件
webSettings.setAllowFileAccess(true);
//设置支持缩放
webSettings.setBuiltInZoomControls(true);
webView.loadUrl(link);
webView.setWebViewClient(new webViewClient ());
修改之后加了不少webview的设置包括:
webSettings.setAppCacheEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.supportMultipleWindows();
webSettings.setAllowContentAccess(true);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setSavePassword(true);
webSettings.setSaveFormData(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setLoadsImagesAutomatically(true);
webView.setWebChromeClient(new WebChromeClient());//这行最好不要丢掉
当然,这些属性可能有些不是必须要添加的,为了尽量满足多种需求,所以我都添加了。
修改完成后就可以在webview中跳转别的url链接了,就算是解决了第一个问题吧。
2.在webview中下载文件无响应
因为本身webview不具备下载功能,所以需要让系统处理或者自定义下载。
webview给我们提供了一个下载监听接口,下面我们来实现下载处理:
class MyDownLoad implements DownloadListener {
@Override
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype, long contentLength) {
if (url.endsWith(".apk")) {
/**
* 通过系统下载apk
*/
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}
}
}
然后再设置中添加:
webView.setDownloadListener(new MyDownLoad());
这里是将下载功能交给系统来处理了,并没有特殊需求所以就不自定义了。
3.部分网址链接无法显示,报错net::err_unknown_url_scheme
由于我们有时候自定义了WebViewClient,内容大致如下:
private class webViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadurl(url)//返回true代表在当前webview中打开,返回false表示打开浏览器
return super.shouldOverrideUrlLoading(view,url); }
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if(!dialog.isShowing()) {
dialog.show();
}
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
if(dialog.isShowing()){
dialog.dismiss();
}
super.onPageFinished(view, url);
}
}
注意shouldOverrideUrlLoading方法,平时我们可能会在其中设置view.loadurl(url),正是这句代码导致部分网页打不开,这可能是webview的本身加载网页有限制吧。所以我把这句去掉了,在返回时返回了true(true表示在当前webview中打开网页,false则更倾向于浏览器打开网页)。这样做,发现部分网页仍然打不开。于是直接删掉了webView.setWebViewClient(new webViewClient ()),而webView.setWebChromeClient(new WebChromeClient())不能删,结果网页是打开了,但有的则自动跳转到浏览器打开的。但我们的需求是不要打开浏览器。。。
4.部分网址打开自动跳转到浏览器
接到上面所讲,打开部分网址跳转到浏览器了,如何不让他跳转呢,返回true可以禁止跳转,但部分网址在webview中无法打开,接下来,不给它直接返回true或false了,而是返回super,让它父类处理,结果也并没有调到浏览器并且网页也打开了,现在暂时就这样结尾了做到了大部分网址的兼容。
总结:本人对webview了解也是有限,所以并不深入只是解决部分问题,可能理解也有偏差,如有问题请见谅。
更多推荐