一、基础设置
//获取webview的配置
WebSettings settings = webView.getSettings();
//配置支持domstorage
settings.setDomStorageEnabled(true);//启用或禁用DOM缓存
settings.setAppCacheEnabled(false);//关闭/启用应用缓存
settings.setSupportZoom(true);//是否可以缩放,默认true
//settings.setBuiltInZoomControls(false);//是否显示缩放按钮,默认false
settings.setJavaScriptEnabled(true);
settings.setAllowContentAccess(true);
settings.setUseWideViewPort(true);//设置此属性,可任意比例缩放。大视图模式
settings.setLoadWithOverviewMode(true);//和setUseWideViewPort(true)一起解决网页自适应问题
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
//下面两方法我们单独来讲
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
在settings完了之后我们再进行url的加载
webView.loadUrl(url);
二、WebChromeClient
WebChromeClient可以用来辅助WebView处理 JavaScript 的对话框、网站图标、网站title、加载进度等。WebView的内部实现并不是完全使用Chrome的内核,而是部分使用Chome内核,其它都是与Chrome不相同的。它常用函数如下:
/**
* 通知程序当前页面加载进度
*/
public void onProgressChanged(WebView view, int newProgress)
/**
* 当网页调用alert()来弹出alert弹出框前回调,用以拦截alert()函数
*/
public boolean onJsAlert(WebView view, String url, String message,JsResult result)
/**
* 当网页调用confirm()来弹出confirm弹出框前回调,用以拦截confirm()函数
*/
public boolean onJsConfirm(WebView view, String url, String message,JsResult result)
/**
* 当网页调用prompt()来弹出prompt弹出框前回调,用以拦截prompt()函数
*/
public boolean onJsPrompt(WebView view, String url, String message,String defaultValue, JsPromptResult result)
/**
* 打印 console 信息
*/
public boolean onConsoleMessage(ConsoleMessage consoleMessage)
1.我们可以将onJsAlert、onJsConfirm、onJsPrompt这三个一起来看,他们都是为了处理弹框
比如说我们加载一个网页,它里面有alert、confirm或者prompt弹框功能,这时我们就要加上
mWebView.setWebChromeClient(new WebChromeClient())
否则可能得不到弹框。
2.使用onJsAlert拦截alert()
比如说我们现在点击alert后,不想要他的弹框,直接进行我们自己的操作处理,这个时候就可以重写onJsAlert来实现:
mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Toast.makeText(context,"屏蔽了弹框",Toast.LENGTH_SHORT).show();
result.confirm();
return true;
}
});
我们来看下上面的三句代码,
第一句直接进行我们自己的操作弹了个Toast;
JsResult有两个函数:JsResult.confirm()和JsResult.cancel(),JsResult.confirm()表示点击了弹出框的确定按钮,JsResult.cancel()则表示点击了弹出框的取消按钮。在我们调用result.confirm();时就相当于我们直接告诉webView我们点击了确定按钮。如果我们不调用的话只会第一次起作用,后面再点击将会失效。
return true:表示告诉WebView我们已经拦截了alert()函数,不需要再弹出网页中的alert弹出框了,如果我们return false,那么WebView就会认为我们没有拦截alert()函数,会继续弹出alert对话框。默认为false
3.onProgressChanged
表示当前页面的加载速度,我们来看下他的函数:
public void onProgressChanged(WebView view, int newProgress)
WebView view:当前WebView实例
int newProgress:当前的加载进度,值从0到100
这里我们可以显示进度条什么的操作,比如我们以顶部进度条为例:
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
progressBar.setVisibility(View.GONE);
} else {
if (View.INVISIBLE == progressBar.getVisibility()) {
progressBar.setVisibility(View.VISIBLE);
}
progressBar.setProgress(newProgress);
}
super.onProgressChanged(view, newProgress);
}
});
xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:fitsSystemWindows="true"
android:layout_height="match_parent"
>
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:id="@+id/myProgressBar"
android:layout_width="match_parent"
android:layout_height="5px"
/>
<WebView
android:layout_below="@id/myProgressBar"
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>