WebView的基本使用
WebView webview =new WebView(this);
//垂直不显示滚动条
webview.setVerticalScrollBarEnabled(false);
//声明WebSettings子类
WebSettings webSettings = webview.getSettings();
//如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
webSettings.setJavaScriptEnabled(true);
//设置自适应屏幕,两者合用
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
//缩放操作
webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
//其他细节操作 缓存设置
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setAllowFileAccess(false); //设置可以访问文件
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
//允许http和https混合
webSettings.setPluginState(WebSettings.PluginState.ON);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setting.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
webSettings.setSavePassword(false);//不保存账号密码
//加载网页标签代码
webView.loadDataWithBaseURL("about:blank", data.getSoftContent(), "text/html", "utf-8", null);
//加载网页
webView.loadYrl("");
//设置显示方式
webview.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.toLowerCase().startsWith("http") || url.startsWith("https:")) {
return false;
}
if (url.startsWith("intent") || url.startsWith("youku")) {
return true;
}
//支付 拨打电话
if (url.startsWith("weixin://") || url.startsWith("alipay") || url.startsWith("tel:")) {
try{
view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
}catch (Exception e){
ToastHelper.showToast("您的设备不支持该操作",WebViewActivity.this);
e.printStackTrace();
}
return true;
}
//在本窗口显示网页,隐藏地址栏
view.loadUrl(url);
//以网页形式显示
// Uri uri = Uri.parse(url);
// Intent intent = new Intent(Intent.ACTION_VIEW, uri);
// startActivity(intent);
return false;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// 接受证书
handler.proceed();
}
});
}
//点击返回返回上一层的网页,无上一层就关闭窗体
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
webview.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
//避免内存溢出,关闭窗体时也要销毁webview
@Override
protected void onDestroy() {
if (webview != null) {
webview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
webview.clearHistory();
((ViewGroup) webview.getParent()).removeView(webview);
webview.destroy();
webview = null;
}
super.onDestroy();
}
js交互
public class AndroidtoJs extends Object {
private Context context;
public AndroidtoJs(Context context) {
super();
this.context = context;
}
@JavascriptInterface
public String onGetPhone(){
Log.i("onGetPhone:","js调用Android方法");
return "00000";
}
}
提供js调用的接口
if (Build.VERSION.SDK_INT >= 17) {
// 在sdk4.2以上的系统上继续使用addJavascriptInterface
AndroidtoJs androidtoJs = new AndroidtoJs(this);
webView.addJavascriptInterface(androidtoJs, "android");
} else {
//4.2之前 addJavascriptInterface有安全泄漏风险
//移除js中的searchBoxJavaBridge_对象,在Android 3.0以下,系统自己添加了一个叫
//searchBoxJavaBridge_的Js接口,要解决这个安全问题,我们也需要把这个接口删除
webView.removeJavascriptInterface("searchBoxJavaBridge_");
}
说明:4.2之前 addJavascriptInterface有安全泄漏风险,这是谷歌官方给出的方案
js调用方法
android.onGetPhone();