webveiw的基本使用?

     今天总结下前段时间,所了解的一个控件webview,对于webview相信很多人已经不默认生了,它主要是可以实现android端与javascript的交互,其实很多复杂的页面我们都可以通过webview.loadUrl("xxx.com")去加载一个html的网页,这样可以简化我们android很多的代码逻辑.

     目的:  这篇文章主要讲解如果使用webveiw,了解webview中的常用方法和属性。

     一般我们有俩种方式来初始化webview控件:

                1、通过findviewById()的方式

                2、WebView mWebView = new WebView(this);

当然我们大部分是采用第一种方式,下面我就用一个案列来讲解webview的常用方法和属性  1 /**  2 * WebView实战

  3  */
  4 public class MainActivity extends Activity {
  5     private  WebView mwebview;
  6     private  ImageView finshimage;
  7     //全局的tag
  8     private static final String Tag="MainActivity";
  9 
 10     @Override
 11     protected void onCreate(Bundle savedInstanceState) {
 12         requestWindowFeature(Window.FEATURE_NO_TITLE);
 13         super.onCreate(savedInstanceState);
 14         setContentView(R.layout.content_main);
 15         initView();
 16     }
 17 
 18     /**
 19      * 初始化WebView
 20      */
 21     public void initView(){
 22          finshimage = (ImageView)findViewById(R.id.finshimage);
 23          mwebview = (WebView)findViewById(R.id.webview);
 24          //允许webview设置参数
 25          WebSettings webSettings = mwebview.getSettings();
 26          //允许webview与javascript交互
 27          webSettings.setJavaScriptEnabled(true);
 28         //设置webview中文本的编码格式
 29          webSettings.setDefaultTextEncodingName("utf-8");
 30         //是否允许自动缩放
 31          webSettings.setBuiltInZoomControls(true);
 32          webSettings.setSupportZoom(true);
 33           //支持自动加载图片
 34          webSettings.setLoadsImagesAutomatically(true);
 35         //讲图片调整到合适的webview控件大小
 36          webSettings.setUseWideViewPort(false);
 37         //设置关闭缓存
 38          webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
 39          //设置WebView重新加载内容
 40          webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
 41 //       mwebview.loadUrl("http://www.163.com/");
 42           mwebview.loadUrl("http://www.baidu.com");
 43          //不调用系统浏览器,而是利用webview打开
 44          mwebview.setWebViewClient(new WebViewClient() {
 45              //让webview的跳转就在webview中完成,而不是跳转到其他的浏览器,可以作为一种屏蔽某些事件的方法
 46              @Override
 47              public boolean shouldOverrideUrlLoading(WebView view, String url) {
 48                  Log.i(Tag, url + "===========shouldOverrideUrlLoading");
 49                  view.loadUrl(url);
 50                  return true;
 51              }
 52 
 53              //更新历史记录
 54              @Override
 55              public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
 56                  Log.i(Tag, url + "===========doUpdateVisitedHistory");
 57                  super.doUpdateVisitedHistory(view, url, isReload);
 58              }
 59 
 60              //重新请求网页数据
 61              @Override
 62              public void onFormResubmission(WebView view, Message dontResend, Message resend) {
 63                  Log.i(Tag, dontResend.toString() + "===========onFormResubmission");
 64                  super.onFormResubmission(view, dontResend, resend);
 65              }
 66 
 67              //加载资源是调用(每次加载资源时都调用)
 68              @Override
 69              public void onLoadResource(WebView view, String url) {
 70                  Log.i(Tag, url + "===========onLoadResource");
 71                  super.onLoadResource(view, url);
 72              }
 73 
 74              //加载页面结束时调用
 75              @Override
 76              public void onPageFinished(WebView view, String url) {
 77                  Log.i(Tag, url + "===========onPageFinished");
 78                  super.onPageFinished(view, url);
 79              }
 80 
 81              @Override
 82              public void onPageCommitVisible(WebView view, String url) {
 83                  Log.i(Tag, url + "===========onPageCommitVisible");
 84                  super.onPageCommitVisible(view, url);
 85              }
 86 
 87              //页面请求发生错误的时候调用
 88              @Override
 89              public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
 90                  Log.i(Tag, errorCode + "===" + description + "======" + failingUrl + "===========onReceivedError");
 91                  super.onReceivedError(view, errorCode, description, failingUrl);
 92              }
 93 
 94              //获取信息授权请求
 95              @Override
 96              public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
 97                  Log.i(Tag, realm + "===========onReceivedHttpAuthRequest");
 98                  super.onReceivedHttpAuthRequest(view, handler, host, realm);
 99              }
100 
101              //处理https的一些请求
102              @Override
103              public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
104                  Log.i(Tag, error + "===========onReceivedSslError");
105                  super.onReceivedSslError(view, handler, error);
106              }
107 
108              //webview发生改变时调用
109              @Override
110              public void onScaleChanged(WebView view, float oldScale, float newScale) {
111                  Log.i(Tag, oldScale + "======" + newScale + "===========onReceivedSslError");
112                  super.onScaleChanged(view, oldScale, newScale);
113              }
114 
115              //重写此方法可以对浏览器中的事件进行监听
116              @Override
117              public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
118                  if (event.getAction() == KeyEvent.ACTION_DOWN) {
119                      Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
120                  }
121                  return super.shouldOverrideKeyEvent(view, event);
122              }
123          });
124         mwebview.addJavascriptInterface(new MyDemo(this), "mydemo");
125         /**
126          * 返回事件
127          */
128         finshimage.setOnClickListener(new View.OnClickListener() {
129             @Override
130             public void onClick(View v) {
131                 MainActivity.this.finish();
132             }
133         });
134         mwebview.setWebChromeClient(new WebChromeClient() {
135             @Override
136             public void onProgressChanged(WebView view, int newProgress) {
137                 Log.i(Tag, "onProgressChanged");
138                 super.onProgressChanged(view, newProgress);
139             }
140 
141 
142             /**
143              * 获取webview的标题
144              * @param view
145              * @param title
146              */
147             @Override
148             public void onReceivedTitle(WebView view, String title) {
149                 Log.i("webview", title + "title");
150                 super.onReceivedTitle(view, title);
151             }
152 
153             /**
154              * 获取webview的图片
155              * @param view
156              * @param icon
157              */
158             @Override
159             public void onReceivedIcon(WebView view, Bitmap icon) {
160                 super.onReceivedIcon(view, icon);
161             }
162         });
163 
164 
165         /**
166          * WebView下载监听有俩种模式
167          * 1、自带的DownLoadListener
168          * 2、自己写的多线程下载,
169          */
170         mwebview.setDownloadListener(new MyDownListener(1));
171     }
172 
173 
174     /**
175      * 重写DownListener监听方法
176      */
177     class MyDownListener implements  DownloadListener{
178         private  int what=0;
179         public MyDownListener(int i){
180             this.what = i;
181         }
182 
183         @Override
184         public void onDownloadStart(final String url, String userAgent, String contentDisposition, String mimetype, 
long contentLength) { 185 if(what==1){ 186 Log.i("down","down"); 187 Uri uri = Uri.parse(url); 188 Intent intent = new Intent(Intent.ACTION_VIEW,uri); 189 startActivity(intent); 190 }else if(what==2){ 191 new Thread(new Runnable() { 192 @Override 193 public void run() { 194 DownFile(url); 195 } 196 }).start(); 197 } 198 } 199 } 200 201 202 203 public void DownFile(String urls){ 204 try{ 205 URL url = new URL(urls); 206 HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 207 InputStream is = connection.getInputStream(); 208 byte [] btye = new byte[1024]; 209 int length =0; 210 File mFile = null; 211 FileOutputStream outputStream = null; 212 StringBuffer buffer = new StringBuffer(); 213 //判断是否含有内存卡 214 if(Environment.getExternalStorageState()==Environment.MEDIA_MOUNTED){ 215 File downFile = Environment.getExternalStorageDirectory(); 216 if(!mFile.exists()){ 217 mFile = new File(downFile,"test.file"); 218 outputStream = new FileOutputStream(mFile); 219 } 220 } 221 while((length = is.read(btye))!=-1){ 222 if(outputStream!=null){ 223 outputStream.write(btye,0,length); 224 } 225 } 226 }catch (Exception e){ 227 e.printStackTrace(); 228 } 229 } 230 231 232 233 234 235 236 class MyDemo{ 237 private Context mContext; 238 public MyDemo(Context context) { 239 this.mContext = context; 240 } 241 /** 242 * 在这个方法当中去调用javascript的方法 243 * 当API大于17时需要在所调用的方法中计入javascriptInterface 注解 244 * @return 245 */ 246 @JavascriptInterface 247 public String Request(){ 248 //进行耗时的网络请求 249 new Handler().postDelayed(new Runnable() { 250 @Override 251 public void run() { 252 Log.i(Tag,"Request"); 253 mwebview.loadUrl("javascript:vale()"); 254 } 255 },1000); 256 return null; 257 } 258 } 259 260 261 /** 262 * 监听返回事件 返回上次的程勋 263 * @param keyCode 264 * @param event 265 * @return 266 */ 267 @Override 268 public boolean onKeyDown(int keyCode, KeyEvent event) { 269 if(keyCode == KeyEvent.KEYCODE_BACK && mwebview.canGoBack()){ 270 mwebview.goBack(); 271 return true; 272 } 273 return false; 274 }

以上就是webview的一些常用方法,代码中多写有注释,多的就不解释了,但有一点要说明下,如果我们要与JavaScript进行交互,必须设置websettings.setJavaS criptEabled(ture); 如果我们要在android端调用js代码我们必须要webview.addJavaScriptInterface(Ojbect,String),主要是进行android与js交互,暴 露自己的方法,另外需注意的是,API在17以下是不需要加@JavaSctrioptInterface注解,只有在API17以上需要加,但是这样会存在一些安全性的问题?
其次需注意的是返回事件的监听,我们必须重写onKeyDown方法,如果不重写当我们访问几个浏览器页面后,这时如果我们按了返回键,它将不是退回到上次浏览的页面 而是这个退出,而我们希望是退回到上次浏览的页面,所以必须重写,并调用webview.goBack()。
至于重写webview加载的路径、已经在进入前的一些初始化函数方法,和下载监听等等方法,在Demo的代码中已有注释说明。好了今天的博客就到此为止。

下一篇博客: 讲解webview加载网页、视频、以及加载视频不能全屏的一些问题的解决?

           

 

posted @ 2016-03-21 18:11  android旅途  阅读(681)  评论(0编辑  收藏  举报