WebView详解

2016年10月10日 最近在做项目时,用到了WebView这个控件,因为之前对WebView并没有什么深入的了解,一直以为这个控件功能很简单,实现主要在web端。但是今天正式用到这个控件时,才发现我对这个控件的了解真的很浅薄,所以特别在这里进行一些记录。

什么是WebView?

WebView是用来显示web page的一个View组件,这个类,是调用浏览器或者在Activity中显示在网页的基础。 WebView采用了Webkit浏览器内核(一种开源浏览器引擎),并且具有导航(后退前进浏览的网页)、缩放网页、执行文本搜索等功能。 看起来webView还是蛮强大的。

WebView的基本用法

使用WebView的基础操作就不在这里介绍了,直接引入控件,findViewById即可,不要忘记加网络权限。

基本用法

Google webView只用来展示一些html作为你的UI界面的一部分,给用户阅读,它能用来和用户进行交互。如果需要一个全面的browser,那你应该使用intent启动一个外部浏览器。例如:

 Uri uri = Uri.parse("http://www.example.com");
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 startActivity(intent);

加载一个url

 webview.loadUrl("http://slashdot.org/");

加载一个HTML字符串

String summary = "<html><body>You scored <b>192</b> points.</body></html>";
 webview.loadData(summary, "text/html", null);

loadData() and loadDataWithBaseUrl()的区别

在使用loadData加载一串html代码时,我发现总是出现编码异常的问题,无论我怎么更改编码,而换作loadDataWithBaseUrl这种问题就消失了 这是因为loadData()中的html 代码中不能包含'#', '%', '', '?'四中特殊字符,这就为我们内嵌css样式等制造了麻烦,因为css中经常用'#', '%'等字符 所以在使用loadData()加载一串html代码时,需要先将这些特殊字符进行转换,好吧真的很麻烦。

参数不同: loadDataWithBaseURL()比loadData()多个参数 baseUrl String: 指定HTML代码片段中相关资源的相对根路径,null代表'about:blank' historyUrl:指定历史URL,null代表'about:blank',如果非null,这个url则必须有效

自定义行为

WebView有几个可以自定义的Behavior,如下:

  1. 创建和设置 WebChromeClient 的子类。作用:进行一些可能影响浏览器的界面的变化的操作,比如加载的进度,js的alert(),web title、icon

  2. 创建和设置 WebViewClient的子类。 作用:负责处理各种通知、请求事件

  3. 修改 WebSettings,比如 setJavaScriptEnabled()

  4. 注入java object到js环境中,通过 addJavascriptOmterface(Object,String)方法。使他们通过js中页面访问

Zoom缩放

使用WebSettings.setBuiltInZoomControls(boolean)方法启用或者关闭内部缩放机制 注意:如果webView的width or height设置为warp_content,那会导致缩放时出现一些不确定的情况,所以google建议使用webView时,却定它的宽和高

Cookies和webView多窗口管理

google建议:出于安全,app应该有自己的cookies管理,此处对cookies不再讨论 多窗口管理可以通过自定义WebChromeClient 其他问题: 当设备出现方向改变,配置发生改变,Activity将会被recreated or destory,这会导致WebView重新加载页面。处理这种情况需要这个链接:Handling Runtime Changes

下面让是常见的方法:

WebSettings

###WebChromeClient

###WebViewClient

下载监听

和JS进行交互

在assert文件夹下新建一个js.html

Java调用JS的方法: 其实调用非常简单,如果你有很深的js功底,完全可以用js写一个android app。 先使用webView.loadUrl("file:///android_asset/js.html");加载这个html文档,然后再使用 webView.loadUrl("javascript:fun1()");方法即可调用js.htmlfun1()方法。

JS调用Java方法: 同样也很简单,

  1. 先自定义一个接口JavaScriptObject:

  1. 使用webView.addJavascriptInterface(new JavaScriptObject(this), "Android");方法将这个接口添加给webView,并指定名称为Android

  2. 当指定完成后,Js就可以在它的代码片段中通过这个Android接口调用他的方法了,这里是显示一个Toast

这样html button被点击时,则会调用android的Toast

最后更新于

这有帮助吗?