webveiw的基本使用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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加载网页、视频、以及加载视频不能全屏的一些问题的解决?
以上是关于webveiw的基本使用?的主要内容,如果未能解决你的问题,请参考以下文章