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 }

呵呵 , 本人安卓小白,是在做项目的时候,边学边做的,很多代码是在网上找的,至于出处我不太记得了。

如有雷同,敬请原谅。

posted @ 2013-11-17 23:12  超级高校の伪学霸_marco  阅读(167)  评论(0)    收藏  举报