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 {@Overridepublic void onShowCustomView(View view, CustomViewCallback callback) {super.onShowCustomView(view, callback);Log.e("tag", "on Show Custom View >>>>>webView");}@Overridepublic 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);




更多相关文章

  1. Android listview+SwipeRefreshLayout 下拉刷新,上拉加载.
  2. SmartRefreshLayout集成笔记,实现下拉刷新上拉加载更多。
  3. Android中如何有效的加载图片
  4. 无法使用@ContextConfiguration加载ApplicationContext(classes =
  5. 使用JNI的步骤
  6. 关于JAVA类加载大家发表一下见解吧
  7. Javascript实现页面加载完成后自动刷新一遍清除缓存文件
  8. Javascript 同步异步加载详解 (十足的好文章!!强烈推荐)
  9. java远程类加载与轻客户端

随机推荐

  1. android CTS测试全pass攻略
  2. Android的dumpsys命令
  3. Android中的Intent和Intent-filter总结
  4. Java for Android
  5. Android进程间通信(一):AIDL使用详解
  6. Android之父深入解析Android
  7. [置顶] android调用第三方库——第四篇—
  8. android 控件位置常用布局
  9. 流水笔记--2015-9-13
  10. Android野史系列:3.利用Android Studio开