什么是webview
Webview是一个基于Android的webkit的内核浏览器的组件,对开发人员来说,和其他的组件没有什么区别,主要作用就是加载一些html网页的信息
Webview的好处
一:兼容已有的项目。在移动端展示已有的网页,通过webview,把已经建好的web页面直接在本地用浏览器打开
二:能够动态的更新,
通过加载网页的形式展现到客户端,一旦发现有bug,服务端修改后客户端就可以立刻展现出来,不会发现任何bug信息,而如果使用其他组件展示,一旦发现bug,只能通过版本更新进行修复,这样体验效果很好不的
Webview的缺点
耗电量大,加载慢,加载时间长容易导致手机发热
Webview怎么用
创建一个webview对象,通过loadurl方法进行加载就可以了
注意:webview加载网络,是需要联网的,这是时候就需要一个联网的权限:
<uses-permission android:name="android.permission.INTERNET"/>
就像这样,这个时候你会发现,虽然加载成功了,可是却发现并不是自己的应用程序加载的这个网页,而是打开了系统的浏览器加载的网页,因为loadUrl()这个方法默认的是调用系统浏览器进行加载网页的。这就很不爽了,如果想让自己的应用程序加载这个网页,就需要调用setWebViewClient()这个方法,并重写里面的shouldOverrideUrlLoading()这个方法。
public booleanshouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
returnsuper.shouldOverrideUrlLoading(view, url);
}
定义WebView的title和进度
设置webview的标题和进度条,主要是要调用setWebChromeClient() 方法,并重写里面的方法进行处理的。
例如:onReceivedTitle ()方法,进行处理显示的标题,直接设置进去就可以了,里面的tvTitle 就是我定义的一个TextView组件。
再如:我们经常会在加载网页的时候显示进度条,这个更容易做,只需要定义一个进度条,然后重写onProgressChanged()这个方法,就可以了,里面的参数newProgress 直接设置到你定义的progressBar中就可以了,而这个newProgress最大的值就是100,也就是加载完成的时候,这个时候你只需要把这个进度条隐藏就可以了。
@Override
public voidonReceivedTitle(WebView view, String title) {
tvTitle.setText(title);
super.onReceivedTitle(view,title);
}
@Override
public voidonProgressChanged(WebView view, int newProgress) {
progressBar.setProgress(newProgress);
if (newProgress ==100) {
progressBar.setVisibility(View.GONE);
}
super.onProgressChanged(view,newProgress);
}
setWebChromeClient()和setWebViewClient() 的区别
setWebChromeClient(): 辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
例如
设置标题 onReceivedTitle(WebView view, String title)
加载进度:onProgressChanged(WebView view, int newProgress)
setWebViewClient (): 主要处理解析,渲染网页等浏览器做的事情,
例如:
使用自己应用程序加载网页:shouldOverrideUrlLoading(WebView view, String url)
网页加载前,onPageStarted(WebView view, String url, Bitmap favicon)
加载后处理,onPageFinished(WebView view, String url)
加载失败: onReceivedError(WebView view, int errorCode, String description, StringfailingUrl)
这里注意:
一般情况下,都会把加载的本地错误页面放到asset目录下面,那么读取asset目录下面的文件路径就是:
file:///android_asset/文件名带后缀
对webview的一些常用设置
调用getSettings()方法,获得WebSettings 对象,从而对webview进行一些相关的设置,主要方法有
private void setWebView(WebView mWebView) {
WebSettings webSettings =mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);//是否支持JavaScript
webSettings.setSupportZoom(true);//是否支持缩放
webSettings.setBuiltInZoomControls(true);//设置是否显示缩放工具,
webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放。
webSettings.setDefaultFontSize(18);//设置默认的字体大小
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过js打开新的窗口
webSettings.setPluginsEnabled(true);//是否支持插件,如flashPlayer \ activityX
webSettings.setBlockNetworkImage(false);//是否显示网络图像
webSettings.setLoadWithOverviewMode(true);// 缩放至屏幕的大小
}
Webview 下载网页中的文件
通过webview下载网页中的文件,主要是调用 setDownloadListener()方法,里面接受的参数就是一个DownloadListener 接口,继承这个内部类,从写里面的方法 onDownloadStart 就可以了,里面的参数
输出的结果可知:
第一个就是你要下载文件的url
第二个参数:userAgent : 应该是一些设备信息,设备的型号,系统版本之类的
中间两个我也不清楚
最后一个应该是这个文件的大小,
下载文件有两种方法:
一种是调用系统的下载方法,这个很简单,就几行代码的:
Uriuri=Uri.parse(url);
Intentintent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
第二种是自己定义网络连接,读取流
URL url = new URL(mUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoInput(true);
// conn.setDoOutput(true);
InputStream in =conn.getInputStream();
具体代码我就不写了,但是在看视频的时候,出现了一个问题,就是按照视频上的代码写,会出现一个java.io.FileNotFoundException:
最后发现原因就是不能添加 conn.setDoOutput(true); 这行代码,至于为什么,不太清楚我是在这个帖子上看到的,http://macleo.iteye.com/blog/1754342
以上是根据慕课网上的视频 http://www.imooc.com/learn/268 和自己的以前的一些知识整理的。。