在Android
中有WebView Widget
,它内置了WebKit
引擎,同时,WebKit
也是Mac OS X
的Safari
网页浏览器的基础。WebKit
是一个开源的浏览器引擎,
Chrome
浏览器也是基于它的。所以很多表现WebView
和Chrome
是一样的。
很多文章中多会说在使用WebView
之前,要在AndroidManifest.xml
中添加 如下权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
否则会出Web page not available
错误。其实这是不全面的,如果我加载本地的页面是不用该权限的。
- 设置WevView要显示的网页方法有很多:
mWebView.loadUrl(“http://www.google.com“);
// 网络mWebView.loadUrl(“file:///android_asset/XX.html“);
// 本地页面,这里的格式是固定的,文件要放到assets
目录下mWebview.postUrl(String url, byte[] postData); // 加载页面使用
Post方式,
postData为参数
- mWebView.loadData(htmlString, “text/html”, “utf-8”); // 加载Html数据
loadData()
不能加载图片内容,如果要加载图片内容或者获得更强大的Web支持请使用loadDataWithBaseURL()
。- 显示乱码
WebView
一般为了节省资源使用UTF-8
编码,而String
类型的数据主要是Unicode
编码,
因此在loadData()
的时候需要设置相应编码让其将Unicode
编码转成UTF-8
但是有些时候设置后还是会出现乱码,这是因为还需要为WebView
中的Text
设置编码,
- 设置WebView基本信息:
- 如果访问的页面中有
Javascript
,则webview
必须设置支持Javascript
。
webview.getSettings().setJavaScriptEnabled(true);
- 触摸焦点起作用
requestFocus() // 如果不设置的话,会出现不能弹出软键盘等问题。
- 取消滚动条
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
- 如果访问的页面中有
- Back键的处理
如果用webview
点链接看了很多页以后,如果不做任何处理,点击系统Back
键,整个浏览器会调用finish()
而结束自身,
如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity
中处理并消费掉该Back
事件。 - WebView中Padding没有效果
WebView
中使用Padding
没有效果,我们在WebView
外层包上一层布局就会有所改进,但是不能完全解决问题,正确的做法是在WebView
的加载css
中增加Padding
-
WebViewClient
如果希望点击链接由自己处理,而不是新开Android
的系统browser
中响应该链接。
给WebView
添加一个事件监听对象WebViewClient
并重写其中的一些方法:shouldOverrideUrlLoading
对网页中超链接按钮的响应。
当按下某个连接时WebViewClient
会调用这个方法,并传递按下的url。- 接收到 Http 请求的事件
onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
-
打开链接前的事件
public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; }
这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。 -
载入页面完成的事件
public void onPageFinished(WebView view, String url){ }
页面载入完成,于是我们可以关闭loading
条,切换程序动作。 -
载入页面开始的事件
public void onPageStarted(WebView view, String url, Bitmap favicon)
这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
- 接收到 Http 请求的事件
WebView
与Js
交互
-
Android
调用WebView
中的js
脚本。 Js
调用Android
中的方法js
中通过如下代码调用即可