Android中的webview详细使用

来源:互联网 发布:hive sql 编辑:程序博客网 时间:2024/05/27 01:10


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 {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {mHomeHeadImageWebView.loadUrl(url);return true;}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);HDLoadingFragmentDialog.hide();/** * 向页面传 */mHomeHeadImageWebView.loadUrl("javascript: homeHeadeImageData('" + uid + "," + id + "')");}@Overridepublic void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {}}

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




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



// 添加js交互接口类,并起别名 imagelistnermHomeHeadImageWebView.addJavascriptInterface(new ClinicalInterface(this), "clinicalQuestRestul");// js通信接口public class ClinicalInterface {private Context context;public ClinicalInterface(Context context) {this.context = context;}@JavascriptInterfacepublic void upLoadClinicalImage(final String deId, final String list) {handler.post(new Runnable() {@Overridepublic void run() {
}});}}

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

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

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

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



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



               /** * 控制在控制台上面输出的信息 */mHomeHeadImageWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result) {return true;}@Overridepublic 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();}}





1 1
原创粉丝点击