项目地址:https://github.com/ambition-hb/WebViewDemo
新建一个WebView项目,然后修改activity_main.xml布局文件中的代码,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.haobi.webviewdemo.MainActivity"> <WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>然后,修改MainActivity中的代码,如下所示:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1、使用findViewById()方法获取到WebView的实例 WebView webView = (WebView)findViewById(R.id.web_view); //2、调用WebView的getSettings()方法去设置一些浏览器的属性 //setJavaScriptEnabled()方法用于设置是否执行页面的js方法 webView.getSettings().setJavaScriptEnabled(true); //3、调用WenView的setWebViewClient()方法并传入一个WebViewClient的实例 //作用在于网页跳转的时候,目标页面仍在当前WebView中显示,而不是打开系统浏览器 webView.setWebViewClient(new WebViewClient()); //4、调用WebView的loadUrl()方法并将网址传入 webView.loadUrl("http://www.baidu.com"); } }最后,在AndroidManifest.xml文件中加入网络请求权限。
<uses-permission android:name="android.permission.INTERNET"/>WebViewClient是WebView的一个辅助类,我们经常使用WebViewClient这个类来监控webview加载网页的状态。
下面的是我们在开发中经常会使用的方法。
onLoadResource
网页加载网页各种资源的回调,比如你的网页使用了各种图片和css文件与js文件
onPageStarted
网页开始加载的回调
onPageFinished
网页加载完成的回调
onReceivedError(WebView view, int errorCode, String description, String failingUrl)
网页加载失败的回调,如果是运行在6.0的手机,需要onReceivedError(WebView, WebResourceRequest, WebResourceError)
shouldOverrideUrlLoading
处理网页内部的跳转
我们经常使用WebChromeClient这个类来处理js交互与网页内容的类
onJsAlert
接收网页的alert事件
onJsPrompt
接收网页的prompt输入框事件
onJsConfirm
接收网页的confirm确认事件
onProgressChanged
页面加载的百分比
onReceivedIcon
接收网页的图标
onReceivedTitle
接收网页的标题
WebSettings是WebView的设置类,能够设置webview的各种详细参数。
setAllowFileAccess(boolean allow)
设置是否使用file协议访问网页,常用于访问assets与raw文件夹下面的网页
setBuiltInZoomControls(boolean enabled)
设置是否使用webview自带的缩放功能
setDatabaseEnabled(boolean flag)
setDomStorageEnabled(boolean flag);
设置是够支持html5的数据库功能
setDefaultFontSize(int size)
设置页面的文字大小
setJavaScriptEnabled(boolean flag)
设置是否执行页面的js方法
setCacheMode
设置返回键的处理,是否使用缓存加载页面,LOAD_DEFAULT(先从cache加载,没有再去网络加载), LOAD_CACHE_ELSE_NETWORK(先从cache加载,没有再去网络加载), LOAD_NO_CACHE(不使用cache) , LOAD_CACHE_ONLY(只使用cache)
android提供的控件,能够加载网页和html数据。
addJavascriptInterface(Object object, String name)
增加一个对象使webview能够让java代码与js交互
loadUrl(String url)
加载一个网页,能够是网络的网页,也能加载本地的网页,本地的网页使用(file:///assets/)来加载。也可以调用一个javaScrpit方法。
loadData(String data, String mimeType, String encoding)
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
加载一段html代码
reload()
刷新当前页面
getTitle()
获取当前页面的标题
canGoBack()
goBack()
判断webview是否能够回到上一步
1、在android 4.2版本以下的手机有一个问题就是,webview会被JavaScript注入,造成手机出现信息安全的问题,比如下载病毒,发送短信等等。问题就出在addJavascriptInterface方法。JavaScript通过调用这个接口可以直接操作本地的JAVA接口。
2、google在4.2的版本上面解决了这个问题,解决的方法是在被js调用的方法上面加上一个声明, @JavascriptInterface,但是4.2版本以下的手机就没有提出官方的解决方法。目前来说在4.2版本以下的手机能够采用以下几个方法来解决安全问题:
1 通过自定义url来进行通信,我们可以重写 shouldOverrideUrlLoading 方法来接收参数2 通过js通过prompt方法传递参数到 onJsPrompt