webView.getSettings().setJavaScriptEnabled(true);//支持js
webView.setWebChromeClient(new ChromeClient());//对js交互的对话框、title以及页面加载进度条的管理
webView.setWebViewClient(new WebViewClient());//对webview页面加载管理、如url重定向
webView.addJavascriptInterface(null, "game");
webView.clearCache(true);//支持缓存
class ChromeClient extends WebChromeClient {
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
super.onShowCustomView(view, callback);
Log.e("tag", "on Show Custom View >>>>>webView");
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
mProgressBar.setProgress(newProgress);
if (newProgress == mProgressBar.getMax()) {
mProgressBar.setVisibility(View.GONE);
} else {
mProgressBar.setVisibility(View.VISIBLE);
}
}
}
重写webVIewClinet:
class WebClient extends WebViewClient {
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
Log.v("tag", "url = " + url);
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
Logcat.dLog("errorCode = "+errorCode);
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {//webview页面加载开始时就会执行此方法、一般用作重定向时的初始化工作
super.onPageStarted(view, url, favicon);
}
/**
* url重定向会执行此方法以及点击页面某些链接也会执行此方法
*
* @param view
* 当前webview
* @param url
* 即将重定向的url
* @return true:表示当前url已经加载完成,即使url还会重定向都不会再进行加载 false 表示此url默认由系统处理,该重定向还是重定向,直到加载完成
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!Tools.urlCheck(url)) {
return true;
}
if (!TextUtils.isEmpty(url) && url.endsWith("apk")) {
Intent viewIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(viewIntent);
} else {
if (!WebViewActivity.processCustomUrl(WebActivity.this, url, null, false)) {
url = WebViewActivity.addCookie2Url(WebActivity.this, url);
// view.loadUrl(url);//(步骤一)
// return true;//(步骤二)
} else {
return true;
}
}
Logcat.dLog("url loading = " + url);
return super.shouldOverrideUrlLoading(view, url);//(步骤三)
}
@Override
public void onPageFinished(WebView view, String url) {//
if (TextUtils.isEmpty(title)) {
title = view.getTitle();
if (!TextUtils.isEmpty(title) && title.length() > 8) {
title = title.substring(0, 8) + "...";
}
titleNameTV.setText(title);
}
super.onPageFinished(view, url);
}
}
注意:
若步骤一执行则会重新加载webView,并且不执行步骤二,则由于会执行步骤三,导致返回false,则系统也会加载一次,导致执行了两次,当执行webview.goBack()返回上一页时就会一直在当前页打转:注:这个url是重定向的url:解决办法:将步骤一和步骤二去掉(本身就是多余的代码,因为返回false系统会执行加载,没必要在执行webVIew.loadUrl(url))
若是将步骤一和步骤二去掉,由于是系统执行的重定向,默认是绑定为一个整体即一个url,当点击webView,goback(),直接返回上页(不是重定向的页面),因为系统管理的webview堆栈(通过此webView.copyBackForwardList()获得堆栈列表,实际是一个对象(包含堆栈的大小,当前加载),再由此对象下ArrayList管理)只记录重定向最初的url,所以返回的时候回直接返回到上一页
shouldOverrideUrlLoading :这个方法的返回值
return true 表示当前url即使是重定向url也不会再执行(除了在return true之前使用webview.loadUrl(url)除外,因为这个会重新加载)
return false 表示由系统执行url,直到不再执行此方法,即加载完重定向的ur(即具体的url,不再有重定向)
注:设置自适应则可能会导致不支持js或css导致界面布局出现错乱
// 自适应屏幕
webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);