Android中一个用于网页显示的控件,实际上,也能够看作一个功能最小化的浏览器,看起来相似于在微信中打开网页连接的页面。WebView主要用于在app应用中方便地访问远程网页或本地html资源。同时,WebView也在Android中充当Java代码和JS代码之间交互的桥梁。javascript
设置WebView至少有两种方法html
通常采用第一种方法,在 Activity中设置加载页面步骤以下java
对变量private WebView wView;
android
电脑本地文件:放在app/src/main/assets下的htmlweb
wView.loadUrl("file:///android_asset/test.html");
chrome
手机本地文件浏览器
wView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
安全
远程资源:微信
需先在清单文件 AndroidManifest文件中为app申请网络使用权限:网络
<uses-permission android:name="android.permission.INTERNET"/>
填入网页地址进行加载
wView.loadUrl("https://www.cnblogs.com/ifever/")
加载 HTML 页面的一小段内容
WView.loadData(String data, String mimeType, String encoding)
wView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return false; }
以上两个方法都会在WebView加载新的url时触发。
Android 5.0如下系统会回调第一个方法,反之回调第二个方法。所以,为了兼容不一样的系统版本,能够同时重写这两个方法。
能够看到,这两个方法都有一个boolean返回值。假如修改成true,会带来重定向问题。
设置true的代码以下
public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url);//手动加载 return true; } public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { view.loadUrl(request.getUrl().toString());//手动加载 return true; }
虽然不会影响加载,不过会带来用户点击回退键始终没法退出应用的问题,下面简单介绍下原理:
假设访问网页过程为A - > B - > C共三个站点,在C时点回退,C - > B没问题,接着再点 B -> A,这个时候问题出现了。尽管B来到了A,可是由于重定向又跳转到了B,如此循环往复...
返回值设为false的状况(且删去view.loadUrl()方法)就可解决这种问题。其实不管返回true仍是false,只要为WebView设置了WebViewClient,都不影响正常的加载功能,只是系统就不会再将url交给第三方的浏览器去处理了。
这两种返回值的真正区别是这样的:
shouldOverrideUrlLoading返回false,表明将url交给当前WebView加载,也就是正常的加载状态;shouldOverrideUrlLoading返回true,表明开发者已经对url进行了处理,WebView就不会再对这个url进行加载了。能够用于屏蔽某些网址,借此实现黑名单机制。
解决了用户点击回退键始终没法退出应用,但还存在一个显著问题:用户但愿回退到上一级页面,却直接退出了app
goBack() //回退到上一级页面
canGoBack()//可否回退到上一级页面
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && wView.canGoBack()) { //若是按下返回键,同时又能够回退到上一级页面,就返回上一级 wView.goBack(); return true; } return super.onKeyDown(keyCode,event); }
默认状况下,返回键会执行finish()方法,结束当前Activity。
有些app为了防止用户误触,在按下返回键且没法回退上一级页面时,会提示须要再次按下返回键,才结束当前Activity。这意味着须要在必定时间内连续按动两次返回键才可退出,设计更加人性化。将上述代码改成
private long exitTime = 0; @Override public void onBackPressed() { if (wView.canGoBack()) { wView.goBack(); } else { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); } } }
此外修改布局文件,经过添加按钮并编写,也能够添加其余新功能,经常使用的有
finish(); //关闭当前Activity,一键退出
wView.reload(); //刷新当前页面
wView.setScrollY(0); //滚动到顶部
public void onProgressChanged(WebView view, int newProgress){
super.onProgressChanged(view,newProgress);
}
newProgress*100,便可得到当前加载的百分比,具体方法网上可查,这里暂不深刻
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view,title);
setTitle(title);
}
在开通Java权限后,能够设置网页弹窗,至少有两种方式,alert、confirm、prompt三种类型的弹窗
放置位置以下:
wView.setWebViewClient(new WebViewClient() { // @Override // public boolean shouldOverrideUrlLoading(WebView view, String url) { // return false; // } @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return false; } @Override public void onPageFinished(WebView view, String url) { //网页加载完成时 super.onPageFinished(view, url); //wView.loadUrl("javascript:alert('hello')"); // wView.evaluateJavascript("javascript:alert('hello')",null); }});
开通Java权限及其余设置见下文
WebSettings 用来管理WebView 状态
为了方便,这里写为WebSettings settings = wView.getSettings();
默认状况下,WebView是不支持Javascript的,须要调用 setJavaScriptEnabled(true),即
settings.setJavaScriptEnabled(true);
好比打开百度,添加该行代码前,网页少了不少广告,进入搜索结果会提示须要切换为完整版(由于没法不支持JS因此没法),但不涉及复杂功能的状况下,不影响使用
添加后,反而容易报错,也存在安全隐患,在本人的oppo r11上调试就会出现net_ERROR错误,暂时找不到缘由
即双指缩放页面的手势控制缩放,由如下代码实现
settings.setUseWideViewPort(true);//设定支持viewport属性,有些页面是很早期的只适配了pc的浏览器的页面,页面很大,须要宽大的视野来展现,这时候设置为true就能够在足够的空间拖动,而且页面能够以任意比例缩放。 settings.setLoadWithOverviewMode(true); //自适应屏幕,用尽量大的视野展现页面,通常和上一属性搭配使用。固然大视野显示的字都很小。 settings.setBuiltInZoomControls(true); // 使用缩放控件 settings.setDisplayZoomControls(false); // 隐藏缩放控件 settings.setSupportZoom(true);//设定支持缩放,只设置此属性并不能实现缩放,在某些版本的手机上也只是能实现点击缩放。
在不少网页依旧不能缩放,经查阅,应该是页面已经被设置好手机样式了,但对于传统的PC版网页,缩放功能仍有效。
WebView在实际使用中须要用到的两个类,这里记录一下两者的区别
WebViewClient主要帮助WebView处理各类通知、请求事件的
WebChromeClient主要帮助WebView处理Javascript的对话框、网站图标、网站title、加载进度等
实际使用的话,若是你的WebView只是用来处理一些html的页面内容,只用WebViewClient就好了,若是须要更丰富的处理效果,好比JS、进度条等,就要用到WebChromeClient,根据实际使用的方法进行回调