转载请标明出处:http://blog.csdn.net/jj583500596/article/details/68944984
一、简介
WebView作为Android控件为Android App开发提供了新的方式,WebView加载Html页面可以作为App交互界面。由于Html页面开发具有及时性,可以用来实现一些App中经常因需求修改而改动的界面,不用因为经常修改而迭代版本。
二、常见API
1.WebView常用API
getSettings() - 获取设置WebView的WebSettings对象。
setWebViewClient(WebViewClient client) - 设置将接收各种通知和请求的WebViewClient。
setWebChromeClient(WebChromeClient client) - 设置chrome处理。
2.WebSettings常用API
setAllowFileAccess - 启用或禁用WebView访问文件数据
setBlockNetworkImage - 是否显示网络图像
setBuiltInZoomControls - 设置是否支持缩放
setFixedFontFamily - 设置固定使用的字体
setJavaScriptEnabled - 设置是否支持Javascript
setLayoutAlgorithm - 设置布局方式
setLightTouchEnabled - 设置用鼠标激活被选项
setSupportZoom - 设置是否支持变焦
setCacheMode - 设置缓冲的模式
setDefaultFontSize - 设置默认的字体大小
setDefaultTextEncodingName - 设置在解码时时候用的默认编码
3.WebChromeClient常用API
onCloseWindow - 关闭WebView
onCreateWindow - 创建WebView
onProgressChanged - 加载进度条改变
onReceivedlcon - 网页图标更改
onReceivedTitle - 网页Title更改
onRequestFocus - WebView显示焦点
onJsAlert - 处理Javascript中的Alert对话框
onJsConfirm - 处理Javascript中的Confirm对话框
onJsPrompt - 处理Javascript中的Prompt对话框
4.WebViewClient 常用API
doUpdateVisitedHistory - 更新历史记录
onFormResubmission - 应用程序重新请求网页数据
onPageStarted - 网页开始加载
onReceivedError - 报告错误信息
onScaleChanged - WebView发生改变
shouldOverrideUrlLoading - 控制新的连接在当前WebView中打开
onLoadResource - 加载指定地址提供的资源
onPageFinished - 网页加载完毕
三、WebView基本设置
1.添加权限
因为WebView要加载网页,所以AndroidManifest.xml中必须添加联网权限,否则会出Web page not available错误。
<uses-permission android:name="android.permission.INTERNET" />
2.创建WebView
- 静态创建
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- 动态创建
WebView mWebView = new WebView(this);
3.初始化WebView
- 如果访问的页面中有Javascript,则webview必须设置支持Javascript:
// 启用WebView对JavaScript的支持
mWebView.getSettings().setJavaScriptEnabled(true);
- 触摸焦点起作用(如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件)
// 触摸焦点起作用(如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件)
mWebView.requestFocus();
- 取消滚动条
// 取消滚动条
mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
- 允许网页缩放
// 允许网页缩放
mWebView.getSettings().setSupportZoom(true);
- 先加载文本,图片放到最后再渲染
// 把图片加载放在最后来加载渲染
mWebView.getSettings().setBlockNetworkImage(true);
- 回退WebView的加载层级,而不是退出Activity
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 是否按下返回键,且WebView现在的层级,可以返回
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
// 返回WebView的上一页面
mWebView.goBack();
return true;
}
return false;
}
- 在WebView开始加载时,显示进度框;加载完毕时,隐藏进度框
mWebView.setWebViewClient(new WebViewClient() {
/**
* WebView加载url完成时,会回调此api,可在这个api中隐藏加载进度框
*/
@Override
public void onPageFinished(WebView view, String url) {
// 此处可添加一些逻辑:隐藏加载进度框
progressbar.setVisibility(GONE);
}
/**
* WebView开始加载url时,会回调此api,可在这个api中显示加载进度框
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// 此处可添加一些逻辑:显示加载进度框
progressbar.setVisibility(VISIBLE);
}
});
mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
progressbar.setVisibility(GONE);
} else {
if (progressbar.getVisibility() == GONE)
progressbar.setVisibility(VISIBLE);
progressbar.setProgress(newProgress);
}
super.onProgressChanged(view, newProgress);
}
});
progressbar.xml样式设置:
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置背景色 -->
<item android:id="@android:id/background" >
<shape>
<corners android:radius="5dp" />
<gradient android:startColor="#ffffff"
android:endColor="#ffffff" />
</shape>
</item>
<!-- 设置进度条颜色 -->
<item android:id="@android:id/progress" >
<clip>
<shape>
<corners android:radius="5dp" />
<gradient android:startColor="#0000ff"
android:endColor="#0000ff" />
</shape>
</clip>
</item>
</layer-list>
引用progressbar.xml
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:id="@+id/myProgressBar"
android:layout_width="match_parent"
android:layout_height="5px"
android:progressDrawable="@drawable/progressbar_webview"
/>
- 设置WevView要显示的网页
加载网络URL地址:
// 加载网络的url地址
mWebView.loadUrl("https://www.baidu.com/");
加载本地URL地址:(本地文件存放在:assets文件中)
// 加载本地的url地址
mWebView.loadUrl("file:///android_asset/test.html");
4.WebView的缺点
- WebView不及时释放导致的内存泄漏
在开发完成后的内存优化时,小伙伴们会发现WebView使用完成后,如果不能及时释放导致的内存泄露是比较严重的,尤其是在WebView使用中调用了broadcast/server等会一直占有线程的方法。所以不再使用WebView时尽快释放WebView的引用。
到这里咱们了解了WebView加载Html的一些常用API与基本设置。希望这篇博客能为小伙伴们提供一些帮助。WebView的初始化会根据需求不同,进行不同的设置。这里我们没有相应的Demo,但咱们现在加载使用WebView加载一些网页还是没有问题的,但是一些WebView js交互还不能使用,咱们下回详。