Android WebView的使用
一、基础使用
这种方式会自动打开手机自带默认浏览器,打开网络地址
1. 添加网络访问权限
<uses-permission android:name="android.permission.INTERNET" /> |
2. 加载网络地址
mWebView = (WebView)findViewById(R.id.lking_webview); //加载网络地址 mWebView.loadUrl("http://baidu.com"); |
二、联合子类WebViewClient的使用
这种方式会在应用内部使用WebView打开网络地址
1. 添加网络访问权限
<uses-permission android:name="android.permission.INTERNET" /> |
2. 加载网络地址
mWebView = (WebView)findViewById(R.id.lking_webview); //WebView加载web资源 mWebView.loadUrl("http://baidu.com"); //覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开 mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器 view.loadUrl(url); return true; } }); |
三、联合子类WebSettings的使用
如果访问的网页中有Javascript,就必须要设置支持Javascript
设置自适应屏幕
缩放操作
其他细节操作
1. 添加网络访问权限
<uses-permission android:name="android.permission.INTERNET" /> |
2. 加载网络地址
mWebView = (WebView)findViewById(R.id.lking_webview); //加载网络地址 mWebView.loadUrl("http://baidu.com"); //启用支持javascript WebSettings settings = mWebView.getSettings(); //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript settings.setJavaScriptEnabled(true); //设置自适应屏幕,两者合用 settings.setUseWideViewPort(true); //将图片调整到适合webview的大小 settings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小 //缩放操作 settings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。 settings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放 settings.setDisplayZoomControls(false); //隐藏原生的缩放控件 //其他细节操作 settings.setAllowFileAccess(true); //设置可以访问文件 settings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 settings.setLoadsImagesAutomatically(true); //支持自动加载图片 settings.setDefaultTextEncodingName("utf-8");//设置编码格式 //覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开 mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器 view.loadUrl(url); return true; } }); |
四、希望浏览的网页后退不是退出浏览器,需要WebView覆盖Url加载,让它自动生成历史访问记录,那样就可以通过前进或后退访问已访问过的站点。
//改写物理按键——返回的逻辑 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode== KeyEvent.KEYCODE_BACK) { if(mWebView.canGoBack()) { mWebView.goBack();//返回上一页面 return true; } else { System.exit(0);//退出程序 } } return super.onKeyDown(keyCode, event); } |
五、判断页面加载过程
mWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { // TODO Auto-generated method stub if (newProgress == 100) { // 网页加载完成 Toast.makeText(MainActivity.this,"加载完成",Toast.LENGTH_SHORT).show(); } else { // 加载中 Toast.makeText(MainActivity.this,"加载中",Toast.LENGTH_SHORT).show(); } } }); 或者使用另一种方式: mWebView.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { //设定加载开始的操作 Toast.makeText(MainActivity.this,"加载中",Toast.LENGTH_SHORT).show(); } @Override public void onPageFinished(WebView view, String url) { //设定加载结束的操作 Toast.makeText(MainActivity.this,"加载完成",Toast.LENGTH_SHORT).show(); } }); |
六、缓存的使用
WebSettings settings = mWebView.getSettings(); //优先使用缓存 settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //不使用缓存 settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据 //LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。 //LOAD_NO_CACHE: 不使用缓存,只从网络获取数据. //LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。 |
七、如何避免WebView内存泄露
1. 不在xml中定义WebView,而是在需要的时候在Activity中创建,并Context使用getApplicationContext();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mWebView = new WebView(getApplicationContext()); mWebView.setLayoutParams(params); mLayout.addView(mWebView); |
2. 在Activity销毁(WebView)的时候,先让WebView加载null内容,然后移除WebView,再销毁WebView,最后置空。
@Override protected void onDestroy() { if (mWebView != null) { mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null); mWebView.clearHistory(); ((ViewGroup) mWebView.getParent()).removeView(mWebView); mWebView.destroy(); mWebView = null; } super.onDestroy(); } |