Android MOA 之 WebView
声明:代码为个人在项目开发中的一些总结和见解,如有错误,请指出,谢谢。
MainFragment 程序主Fragment 主要为WebView,下面为主要代码。
1 package com.costech.android.fragment; 2 3 4 5 import java.util.HashMap; 6 7 import android.app.AlertDialog; 8 import android.content.Intent; 9 import android.graphics.Bitmap; 10 import android.net.Uri; 11 import android.os.Bundle; 12 import android.os.Handler; 13 import android.os.Message; 14 import android.support.v4.app.Fragment; 15 import android.util.Log; 16 import android.view.KeyEvent; 17 import android.view.LayoutInflater; 18 import android.view.MotionEvent; 19 import android.view.View; 20 import android.view.View.OnClickListener; 21 import android.view.View.OnTouchListener; 22 import android.view.ViewGroup; 23 import android.webkit.DownloadListener; 24 import android.webkit.JsResult; 25 import android.webkit.SslErrorHandler; 26 import android.webkit.WebChromeClient; 27 import android.webkit.WebSettings; 28 import android.webkit.WebView; 29 import android.webkit.WebViewClient; 30 import android.widget.ImageView; 31 import android.widget.TextView; 32 import android.widget.Toast; 33 34 import com.costech.android.R; 35 import com.costech.android.activity.MainActivity; 36 import com.costech.android.entity.FolderMOA; 37 import com.costech.android.util.SystemConstant; 38 39 public class MainFragment extends Fragment { 40 ImageView lv_left; //左滑按鈕 41 //ImageView iv_right; 42 43 private WebView webView; 44 private WebSettings mSettings; 45 ImageView refresh; 46 ImageView goback; 47 TextView contentTitle; 48 49 private String userid; 50 private String username; 51 private String password; 52 private String strArr; 53 private boolean isLogin = false; 54 private Handler mHandler = new Handler(){ 55 56 @Override 57 public void handleMessage(Message msg) { 58 // TODO Auto-generated method stub 59 switch (msg.what) { 60 case 0: 61 contentTitle.setText(msg.obj.toString()); 62 break; 63 case 1: 64 contentTitle.setText(msg.obj.toString()); 65 break; 66 default: 67 break; 68 } 69 } 70 71 }; 72 73 public View onCreateView(LayoutInflater inflater, ViewGroup container, 74 Bundle savedInstanceState) { 75 View mView = inflater.inflate(R.layout.main_frame, null); 76 //lv_left = (ImageView) mView.findViewById(R.id.iv_left); //點擊顯示菜單的按鈕 77 //iv_right = (ImageView) mView.findViewById(R.id.iv_right); 78 79 refresh = (ImageView) mView.findViewById(R.id.backtohome); //返回主页 80 goback = (ImageView)mView.findViewById(R.id.back); //后退键 81 contentTitle = (TextView) mView.findViewById(R.id.contentTitle); 82 83 //初始化WebView控件 84 webView = (WebView) mView.findViewById(R.id.maincontentWV); 85 init(); 86 if(((MainActivity) getActivity()).getNetworkState()){ 87 initContent(); //有網絡的時候初始化數據內容 88 }else{ 89 webView.loadUrl("file:///android_asset/load_error_tie.html"); 90 } 91 92 //初始化WenView監聽 93 setListener(); 94 95 return mView; 96 } 97 98 99 public void onActivityCreated(Bundle savedInstanceState) { 100 super.onActivityCreated(savedInstanceState); 101 102 } 103 104 private void init(){ 105 mSettings = webView.getSettings(); //獲取網頁設置 106 mSettings.setJavaScriptEnabled(true);//設置啟用JS 107 mSettings.setAllowFileAccess(true);//设置允许访问文件数据 108 mSettings.setBuiltInZoomControls(true);//設置變大縮小控制 109 mSettings.setJavaScriptCanOpenWindowsAutomatically(true); 110 mSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); 111 webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 112 webView.addJavascriptInterface(new MHandler(), "handler"); 113 //mSettings.setSaveFormData(false); // 不保存表单数据 114 //mSettings.setSavePassword(false); // 不保存密码 115 //mSettings.setAppCacheEnabled(true);//应用不可以有缓存 116 } 117 118 /** 119 * 初始化 webView 內容 120 */ 121 private void initContent(){ 122 strArr = ((MainActivity) getActivity()).getParams(); 123 String[] tempStr = strArr.split(","); 124 userid = tempStr[0]; 125 username = tempStr[1]; 126 password = tempStr[2]; 127 128 webView.loadUrl(SystemConstant.WEBVIEW_URL + "&userid=" + userid + "&username=" + username); 129 } 130 131 132 /** 133 * 返回主頁 134 * @param url 地址 135 */ 136 public void backHome(String url){ 137 webView.loadUrl(url); 138 } 139 140 /** 141 * 設置控件監聽 142 */ 143 private void setListener(){ 144 145 //刷新按钮 其实就只做了返回主页的操作 146 refresh.setOnClickListener(new OnClickListener() { 147 148 @Override 149 public void onClick(View arg0) { 150 // TODO Auto-generated method stub 151 backHome(SystemConstant.WEBVIEW_URL + "&userid=" + userid + "&username=" + username); 152 } 153 }); 154 //刷新按钮点击效果 155 refresh.setOnTouchListener(new OnTouchListener() { 156 157 @Override 158 public boolean onTouch(View v, MotionEvent event) { 159 // TODO Auto-generated method stub 160 if (event.getAction() == MotionEvent.ACTION_UP) { 161 Log.d("test", "refresh button ---> cancel"); 162 refresh.setImageDrawable(getResources().getDrawable(R.drawable.refresh)); 163 } 164 if (event.getAction() == MotionEvent.ACTION_DOWN) { 165 Log.d("test", "refresh button ---> down"); 166 refresh.setImageDrawable(getResources().getDrawable(R.drawable.refresh_down)); 167 } 168 return false; 169 } 170 }); 171 //返回按钮 172 goback.setOnClickListener(new OnClickListener() { 173 174 @Override 175 public void onClick(View v) { 176 // TODO Auto-generated method stub 177 webView.goBack(); 178 } 179 }); 180 181 goback.setOnTouchListener(new OnTouchListener() { 182 183 @Override 184 public boolean onTouch(View v, MotionEvent event) { 185 // TODO Auto-generated method stub 186 if (event.getAction() == MotionEvent.ACTION_UP) { 187 Log.d("test", "refresh button ---> cancel"); 188 goback.setImageDrawable(getResources().getDrawable(R.drawable.back)); 189 } 190 if (event.getAction() == MotionEvent.ACTION_DOWN) { 191 Log.d("test", "refresh button ---> down"); 192 goback.setImageDrawable(getResources().getDrawable(R.drawable.back_down)); 193 } 194 return false; 195 } 196 }); 197 //瀏覽器 198 webView.setWebViewClient(new WebViewClient(){ 199 200 @Override 201 public void onReceivedError(WebView view, int errorCode, 202 String description, String failingUrl) { 203 // 重写此方法用于没有网路时,出现找不到该页面是跳转到提示页面 204 webView.loadUrl("file:///android_asset/load_error_tie.html"); 205 super.onReceivedError(view, errorCode, description, failingUrl); 206 } 207 208 public boolean shouldOverrideUrlLoading(WebView view, String url) { 209 // 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边 210 webView.loadUrl(url); 211 return true; 212 } 213 214 public void onReceivedSslError(WebView view, 215 SslErrorHandler handler, android.net.http.SslError error) { 216 // 重写此方法可以让webview处理https请求 217 handler.proceed(); 218 } 219 220 @Override 221 public void onPageFinished(WebView view, String url) { //页面加载完成的时候获取title 222 // TODO Auto-generated method stub 223 super.onPageFinished(view, url); 224 Log.d("GetTitle", "The page load finished."); 225 //獲取JSP頁面title元素內容 226 webView.loadUrl("javascript:window.handler.changeTitle(document.getElementById('title').value);"); 227 ((MainActivity) getActivity()).dismissDialog();//加载完成后关闭极度条 228 } 229 230 @Override 231 public void onPageStarted(WebView view, String url, Bitmap favicon) { 232 // TODO Auto-generated method stub 233 super.onPageStarted(view, url, favicon); 234 ((MainActivity) getActivity()).Dialog("数据正在加载中...");//页面开始加载的时候进行 打开进度条 235 } 236 }); 237 238 webView.setOnKeyListener(new View.OnKeyListener() { //WebView单击事件 239 240 public boolean onKey(View v, int keyCode, KeyEvent event) { 241 // TODO Auto-generated method stub 242 if(event.getAction() == KeyEvent.ACTION_DOWN){ //判断按下事件 243 if(keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()){//判断按键点击的返回,判断WebView存在可返回页 244 245 webView.goBack(); //后退 246 247 return true; //已处理 248 } 249 250 } 251 return false; 252 } 253 }); 254 255 //此方法用於解決WebView對於window.alert()失效的問題 256 webView.setWebChromeClient(new WebChromeClient(){ 257 258 @Override 259 public boolean onJsAlert(WebView view, String url, String message, 260 JsResult result) { 261 // TODO Auto-generated method stub 262 return ((MainActivity) getActivity()).onJsAlert(view, url, message, result);//将浏览器返回的对话框文字返回给安卓对话框 263 264 } 265 }); 266 //WebView實現文件下載功能 用于webView没有支持下载的问题 267 webView.setDownloadListener(new DownloadListener() { 268 269 public void onDownloadStart(String url, String userAgent, 270 String contentDisposition, String mimetype, 271 long contentLength) { 272 // handle download, here we use brower to download, also you can try other approach. 273 Uri uri = Uri.parse(url); 274 Intent intent = new Intent(Intent.ACTION_VIEW, uri); 275 startActivity(intent); 276 } 277 }); 278 279 } 280 281 //此handler用于改变主页Title的文字 282 class MHandler{ 283 public void changeTitle(String data) { 284 Log.v("----------------------- title : ",data); 285 Message msg = new Message(); 286 if(!"".equals(data)){ 287 msg.obj = data; 288 msg.what = 0; 289 mHandler.sendMessage(msg); 290 }else{ 291 msg.obj = ""; 292 msg.what = 1; 293 mHandler.sendMessage(msg); 294 } 295 296 } 297 } 298 299 }
下面为MainActivity中相关的方法:
这段为获取WebView中页面返回的对话框内容:
1 //用於無法WebView無法調用Window.alert();的方法 但會有地址顯示在title欄 2 public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { 3 AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this) 4 .setTitle("退出?").setMessage(message) 5 .setPositiveButton("ok", 6 new AlertDialog.OnClickListener() { 7 @Override 8 public void onClick(DialogInterface dialog, 9 int which) { 10 result.confirm(); 11 12 } 13 }); 14 15 alertDialog.setCancelable(false); 16 alertDialog.create(); 17 alertDialog.show(); 18 return true; 19 }
此处为WebView在开始加载和接受加载是使用的方法
1 /** 2 * 進度條 對話框 3 * @param showString 傳入相關值 4 */ 5 public void Dialog(String showString){ 6 layoutInflater = LayoutInflater.from(MainActivity.this); 7 View view = layoutInflater.inflate(R.layout.progress_dialog, null); 8 ((TextView)view.findViewById(R.id.progress_msg)).setText(showString); 9 dialog = new AlertDialog.Builder(MainActivity.this).setView(view).create(); 10 dialog.show(); 11 } 12 13 //关闭进度条 14 public void dismissDialog(){ 15 dialog.dismiss(); 16 }
呵呵 , 本人安卓小白,是在做项目的时候,边学边做的,很多代码是在网上找的,至于出处我不太记得了。
如有雷同,敬请原谅。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号