Android中的webview详细使用

原创 2015年11月06日 21:39:18


webview向html传递参数



方式一  通过 cookie传参

			CookieSyncManager.createInstance(this);
			CookieManager cookieManager = CookieManager.getInstance();
			cookieManager.setAcceptCookie(true);
			cookieManager.setCookie(mNewsUrl, "uid=" + uid);
			cookieManager.setCookie(mNewsUrl, "imnewsId=" + id);
			CookieSyncManager.getInstance().sync();
		


这里是通过 cookie向html传递了uid  和 id 两个参数 

不过需要注意的是 在设置了 cookie后,webview的一些功能可能会无法正常使用

这里使用到的mNewsUrl 就是要传参的页面

方式二 通过js传参


mHomeHeadImageWebView.loadUrl("javascript: homeHeadeImageData('" + uid + "," + id + "')");


这里是通过调用html页面的方法homeHeadeImageData(String str);方法,向页面传递了 uid 和id 这两个参数 ,不过页面接收到的是一个字符串,这里使用,分隔开的,

这个方法在使用的时候 最好是在页面加载完成后再进行调用,以防页面加载的时候 ,出现页面还没有初始化这个方法,造成传参失败的结果


private class MyWebViewClient extends WebViewClient {


		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			mHomeHeadImageWebView.loadUrl(url);
			return true;
		}

		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
			

		}

		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			HDLoadingFragmentDialog.hide();
			/**
			 * 向页面传
			 */
			mHomeHeadImageWebView.loadUrl("javascript: homeHeadeImageData('" + uid + "," + id + "')");

			
		}

		@Override
		public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
			

		}
	}

	

 然后webView中进行使用
mHomeHeadImageWebView.setWebViewClient(new MyWebViewClient());




html与java通信,调用java中的方法



// 添加js交互接口类,并起别名 imagelistner
		mHomeHeadImageWebView.addJavascriptInterface(new ClinicalInterface(this), "clinicalQuestRestul");


// js通信接口
	public class ClinicalInterface {
		private Context context;

		public ClinicalInterface(Context context) {
			this.context = context;
		}

	
		@JavascriptInterface
		public void upLoadClinicalImage(final String deId, final String list) {

			handler.post(new Runnable() {
				@Override
				public void run() {
					
				}
			});

		}
}

1. ClinicalInterface  是html通信调用的接口,html调用的方法全部在里面定义 

2. 在ClinicalInterface  通信接口中调用的方法 在android4.2版本以上,必须添加注解 @JavascriptInterface 才可以生效,否则页面是无法调用这个方法的

3. 本例中的upLoadClinicalImage方法 是页面要调用 的方法,并且传递两个参数过来

4. 页面要调用此接口,使用的对象 是 别名 clinicalQuestRestul



webView加载的时候控制 控制台上面的输出内容



               /**
		 * 控制在控制台上面输出的信息
		 */
		mHomeHeadImageWebView.setWebChromeClient(new WebChromeClient() {
			@Override
			public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
				return true;
			}

			@Override
			public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
				Log.d("clinical ", consoleMessage.message() + "from line" + consoleMessage.lineNumber() + "of"
						+ consoleMessage.sourceId());
				return true;
			}
		});




设置webview的缓存数据 




	protected void initCommonFouncation(boolean b) {
		
		// 设置缓存的大小
		mHomeHeadImageWebView.getSettings().setAppCacheMaxSize(1024 * 10);
		//  设置缓存模式
		// 建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。

		if (isnetWork()) {
			mHomeHeadImageWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);// 优先使用缓存
		} else {
			mHomeHeadImageWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
		}

		String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;
		// String cacheDirPath =
		// getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME;
		// 设置数据库缓存路径
		mHomeHeadImageWebView.getSettings().setDatabasePath(cacheDirPath);
		// 设置 Application Caches 缓存目录
		mHomeHeadImageWebView.getSettings().setAppCachePath(cacheDirPath);
		// 开启 Application Caches 功能
		mHomeHeadImageWebView.getSettings().setAppCacheEnabled(true);

		mHomeHeadImageWebView.loadUrl(mNewsUrl);

	}


清除webview的缓存缓存数据



      public void clerWebviewCache() {
		if (mHomeHeadImageWebView != null) {
			mHomeHeadImageWebView.clearCache(true);
			mHomeHeadImageWebView.clearHistory();
			mHomeHeadImageWebView.clearFormData();
		}
	}

	/**
	 * 清除WebView缓存
	 */
	public void clearWebViewCache() {

		// 清理Webview缓存数据库
		try {
			deleteDatabase("webview.db");
			deleteDatabase("webviewCache.db");
		} catch (Exception e) {
			e.printStackTrace();
		}

		// WebView 缓存文件
		File appCacheDir = new File(getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME);

		File webviewCacheDir = new File(getCacheDir().getAbsolutePath() + "/webviewCache");

		// 删除webview 缓存目录
		if (webviewCacheDir.exists()) {
			deleteFile(webviewCacheDir);
		}
		// 删除webview 缓存 缓存目录
		if (appCacheDir.exists()) {
			deleteFile(appCacheDir);
		}
	}

	/**
	 * 递归删除 文件/文件夹
	 * 
	 * @param file
	 */
	public void deleteFile(File file) {

		if (file.exists()) {
			if (file.isFile()) {
				file.delete();
			} else if (file.isDirectory()) {
				File files[] = file.listFiles();
				for (int i = 0; i < files.length; i++) {
					deleteFile(files[i]);
				}
			}
			file.delete();
		} else {
		}
	}










package com.administrator.interviewsummary;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Bundle;
import android.os.Message;
import android.view.InputEvent;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.webkit.ClientCertRequest;
import android.webkit.HttpAuthHandler;
import android.webkit.JsResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/***
 * webview是基于webkit内核,它的运行效果与firefox上的一模一样
 * webview与js的双向交互才是android中的webview功能强大所在
 */
public class MainActivity extends Activity {

    private WebView webview ;
    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        //实例化WebView对象
        webview = (WebView) findViewById(R.id.webview);
        //设置WebView属性,能够执行Javascript脚本
        WebSettings settings = webview.getSettings();
        //支持js脚本
        settings.setJavaScriptEnabled(true);
        //设置启动缓存
        settings.setAppCacheEnabled(true);
        //设置缓存的大小
        settings.setAppCacheMaxSize(1024 * 10);
        //设置缓存模式
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//优先使用缓存
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存

        //设置缓存,离线应用
        settings.setAppCacheEnabled(true) ;
        settings.setAppCacheMaxSize(1024 * 1024 * 8);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);



        //设置可以自动加载图片
        settings.setLoadsImagesAutomatically(true);
        //设置可以访问文件
        settings.setAllowFileAccess(true);
        //设置图片调整到适合webView的方法
       settings.setUseWideViewPort(false);
        //设置支持多窗口的
        settings.setSupportMultipleWindows(true);
        //支持缩放,设置成拖动放大缩小
        settings.setSupportZoom(true );
        settings.setBuiltInZoomControls(true) ;
        //支持内容从新布局
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

        //加载需要显示的网页
        webview.loadUrl("http://www.baidu.com/");
        //加载本地的html
        //webview.loadUrl("file:///android_asset/example.html");

        //点击链接留在当前的webview中进行数据的显示,而不是跳转到新的页面,重写这个方法
        webview.setWebViewClient(new WebViewClient() {
            //请求的是链接,当返回的是true时候,打开新的链接不会跳转到浏览器那边
            //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // return super.shouldOverrideUrlLoading(view, url);
                webview.loadUrl(url);
                return true;
            }

            //当开始载入页面的时候调用
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                //显示正在加载中的对话框
                mProgressDialog.show();
            }

            //当一个页面加载完成时候调用
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                //隐藏正在加载的圣诞框的提示信息
                mProgressDialog.dismiss();

            }

            //加载页面资源会调用,每加载一次就会调用一次
            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }

            @Override
            public void onPageCommitVisible(WebView view, String url) {
                super.onPageCommitVisible(view, url);
            }

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                return super.shouldInterceptRequest(view, url);
            }

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                return super.shouldInterceptRequest(view, request);
            }

            @Override
            public void onTooManyRedirects(WebView view, Message cancelMsg, Message continueMsg) {
                super.onTooManyRedirects(view, cancelMsg, continueMsg);
            }

            //报告错误
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
            }

            @Override
            public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
                super.onReceivedHttpError(view, request, errorResponse);
            }

            //应用程序重新请求网页数据
            @Override
            public void onFormResubmission(WebView view, Message dontResend, Message resend) {
                super.onFormResubmission(view, dontResend, resend);
            }

            //更新历史记录
            @Override
            public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
                super.doUpdateVisitedHistory(view, url, isReload);
            }

            //重写此方法,可以让webview执行https请求
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                super.onReceivedSslError(view, handler, error);
            }

            @Override
            public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
                super.onReceivedClientCertRequest(view, request);
            }

            //返回信息授权请求
            @Override
            public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
                super.onReceivedHttpAuthRequest(view, handler, host, realm);
            }

            //重写此方法才可以处理浏览器中的按键事件
            @Override
            public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
                return super.shouldOverrideKeyEvent(view, event);
            }

            //当key事件未被加载的时候调用
            @Override
            public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
                super.onUnhandledKeyEvent(view, event);
            }

            @Override
            public void onUnhandledInputEvent(WebView view, InputEvent event) {
                super.onUnhandledInputEvent(view, event);
            }

            //当webview发生改变的时候调用这个方法
            @Override
            public void onScaleChanged(WebView view, float oldScale, float newScale) {
                super.onScaleChanged(view, oldScale, newScale);
            }

            @Override
            public void onReceivedLoginRequest(WebView view, String realm, String account, String args) {
                super.onReceivedLoginRequest(view, realm, account, args);
            }
        });
        //设置webview中可以输入text
        webview.requestFocus();
        //设置Web视图


        //获取网页对话框
        webview.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                 //构建一个来显示网页中的对话框
                return true;
            }

            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                 return true;
            }

            //加载进度
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                 super.onProgressChanged(view,newProgress);
            }
        }) ;


        mProgressDialog = ProgressDialog.show(this, "请稍后", "页面正在加载中");

        //webview获取焦点
        webview.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                webview.requestFocus();
                return false;
            }
        }) ;


    }

    @Override
    //设置回退
    //覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
            webview.goBack(); //goBack()表示返回WebView的上一页面
            return true;
        }
        return false;
    }

    //Web视图
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }







}



加载html时,通过cookie进行数据传递


        if (userinfo != null) {

			CookieSyncManager.createInstance(this);
			CookieManager cookieManager = CookieManager.getInstance();
			cookieManager.setAcceptCookie(true);
			cookieManager.setCookie(mNewsUrl, "uid=" + uid);
			cookieManager.setCookie(mNewsUrl, "id=" + id);
			CookieSyncManager.getInstance().sync();
		}


清除webview的缓存 


public void clerWebviewCache(){
		if (mHomeHeadImageWebView != null) {
			mHomeHeadImageWebView.clearCache(true);
			mHomeHeadImageWebView.clearHistory();
			mHomeHeadImageWebView.clearFormData();
		}
	}





版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android 使用Webview时候清楚缓存各种方式无效后

最近在使用WebView来开发,但是遇到个问题就是缓存清除不掉,偶在网上找了好久各种方式...

webview onReceivedError 接收不到404

在android里面加入webview的时候,有时候需要捕获http error,例如404等错误。在api 22 以下 系统提供onReceivedError方法。根据google官网提供的文档,o...

Android的WebView加载网页的几种方式及网络异常处理

Android的webview加载本地html、assert内html和收集URL 2013年4月16日联系商易上海电子商务网站建设,了解更多   ...

Android问题集(七)——webview 使用问题三四个

一、webview使用须知问题
  • youngwm
  • youngwm
  • 2016年02月21日 10:24
  • 2978

Android WebView 开发详解(二)

分享Android WebView 开发实战经验,WebView的各种主要的回调说明,详解回调的含义和用途,以及应用程序需要如何响应这些操作。...
  • typename
  • typename
  • 2014年10月17日 18:02
  • 67814

Android 拦截WebView加载URL,控制其加载CSS、JS资源

绪论最近在项目中有了这样一个需求,我们都知道WebView加载网页可以缓存,但是web端想让客服端根据需求来缓存网页,也就是说web端在设置了http响应头,我根据这个头来拦截WebView加载网页,...
  • lyhhj
  • lyhhj
  • 2015年10月30日 21:47
  • 7917

WebView详解(一)

代码示例地址前言WebView一直是安卓的一个大坑,新版本经常会废弃旧版本的api,导致在使用WevView的时候经常会遇到各种各样的问题,在此整理下WebView的用法及一些坑。 一、 WebVi...
  • kui2015
  • kui2015
  • 2016年08月19日 11:36
  • 4247

Android WebView使用解析一

随着APP中HTML5的占比的增加,WebView这个控件的使用也越来越频发。开发中比较常见的例如新闻详情、课程详情、商品详情、商品展示页等,甚至有些APP中直接把登录注册也直接采用WebView内嵌...

WebView调用了onReceivedError之后,还是调用onPageFinished。

http://stackoverflow.com/questions/23808868/is-onpagefinished-is-called-after-onreceivederror-in-any...

WebView使用详解(二)——WebViewClient与常用事件监听

前言:生活的艰难,更会激发对梦想的渴望,但艰难的生活却往往会成为梦想的绊脚石上篇给大家简单讲了Webview中Native代码与JS相互调用的方法,这篇我们再讲讲有关各种拦截与处理的东东。一、WebV...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中的webview详细使用
举报原因:
原因补充:

(最多只允许输入30个字)