Android控件WebView的屬性設置和相關常用方法總結

1. 打開網頁時不調用系統瀏覽器, 而是在本WebView中顯示:

複製代碼
mWebView.setWebViewClient(new WebViewClient(){
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url);
          return true;
      }
  });
複製代碼

2. 通過java代碼調用javascript

複製代碼
WebSettings webSettings =   mWebView .getSettings();       
webSettings.setJavaScriptEnabled(true); 
mWebView.addJavascriptInterface(new Object() {       
            public void clickOnAndroid() {       
                mHandler.post(new Runnable() {       
                    public void run() {       
                        webview.loadUrl("javascript:wave()");       
                    }       
                });       
            }       
        }, "demo"); 
複製代碼

3. 按返回鍵時, 不退出程序而是返回上一瀏覽頁面:

複製代碼
public boolean onKeyDown(int keyCode, KeyEvent event) {       
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {       
            mWebView.goBack();       
            return true;       
        }       
        return super.onKeyDown(keyCode, event);       
    }
複製代碼

4. 打開頁面時, 自適應屏幕:

WebSettings webSettings =   mWebView .getSettings();       
webSettings.setUseWideViewPort(true);//設置此屬性,可任意比例縮放
webSettings.setLoadWithOverviewMode(true);

5. 便頁面支持縮放:

WebSettings webSettings =   mWebView .getSettings();       
webSettings.setJavaScriptEnabled(true);  
webSettings.setBuiltInZoomControls(true);
webSettings.setSupportZoom(true);

6.如果webView中需要用戶手動輸入用戶名、密碼或其他,則webview必須設置支持獲取手勢焦點。

webview.requestFocusFromTouch();

7.WebView 加載界面主要調用三個方法:LoadUrl、LoadData、LoadDataWithBaseURL. 

1、LoadUrl            直接加載網頁、圖片並顯示.(本地或是網絡上的網頁、圖片、gif)  
2、LoadData           顯示文字與圖片內容 (模擬器1.5、1.6)  
3、LoadDataWithBase  顯示文字與圖片內容(支持多個模擬器版本) 

8.WebSettings 的常用方法介紹

複製代碼
setJavaScriptEnabled(true);  //支持js

setPluginsEnabled(true);  //支持插件 

setUseWideViewPort(false);  //將圖片調整到適合webview的大小 

setSupportZoom(true);  //支持縮放 

setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持內容重新佈局  

supportMultipleWindows();  //多窗口 

setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  //關閉webview中緩存 

setAllowFileAccess(true);  //設置可以訪問文件 

setNeedInitialFocus(true); //當webview調用requestFocus時爲webview設置節點

webview webSettings.setBuiltInZoomControls(true); //設置支持縮放 

setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口 

setLoadWithOverviewMode(true); // 縮放至屏幕的大小

setLoadsImagesAutomatically(true);  //支持自動加載圖片
複製代碼

9.WebViewClient 的方法全解

複製代碼
doUpdateVisitedHistory(WebView view, String url, boolean isReload)  //(更新歷史記錄) 

onFormResubmission(WebView view, Message dontResend, Message resend) //(應用程序重新請求網頁數據) 

onLoadResource(WebView view, String url) // 在加載頁面資源時會調用,每一個資源(比如圖片)的加載都會調用一次。 

onPageStarted(WebView view, String url, Bitmap favicon) //這個事件就是開始載入頁面調用的,通常我們可以在這設定一個loading的頁面,告訴用戶程序在等待網絡響應。 

onPageFinished(WebView view, String url) //在頁面加載結束時調用。同樣道理,我們知道一個頁面載入完成,於是我們可以關閉loading 條,切換程序動作。 

onReceivedError(WebView view, int errorCode, String description, String failingUrl)// (報告錯誤信息) 

onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)//(獲取返回信息授權請求) 
 
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重寫此方法可以讓webview處理https請求。
 
onScaleChanged(WebView view, float oldScale, float newScale) // (WebView發生改變時調用) 

onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加載時調用) 

shouldOverrideKeyEvent(WebView view, KeyEvent event)//重寫此方法才能夠處理在瀏覽器中的按鍵事件。 

shouldOverrideUrlLoading(WebView view, String url) 
//在點擊請求的是鏈接是纔會調用,重寫此方法返回true表明點擊網頁裏面的鏈接還是在當前的webview裏跳轉,不跳到瀏覽器那邊。這個函數我們可以做很多操作,比如我們讀取到某些特殊的URL,於是就可以不打開地址,取消這個操作。我們可以截取點擊的鏈接地址,並對它重新定向。

-------------------------------------------------------------另一種角度------------------------------------------------------------


一、WebView基於webkit引擎展現web頁面的控件,使用前需要在Android Manifest file中配置internet訪問權限,否則提示頁面無法訪問。

  1. <</span>manifest ... >  
  2.     <</span>uses-permission android:name="android.permission.INTERNET" />  
  3.     ...  
  4. </</span>manifest> 
 

二、WebView屬性的設置   1、設置WebSettings類      WebSettings用來對WebView的配置進行配置和管理,比如是否可以進行文件操作、緩存的設置、頁面是否支持放大和縮小、是否允許使用數據庫api、字體及文字編碼設置、是否允許js腳本運行、是否允許圖片自動加載、是否允許數據及密碼保存等等      示例代碼如下:
  1. WebSettings webSettings mWebView.getSettings();  
  2. webSettings.setJavaScriptEnabled(true);  
  3. webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);   
  4. webSettings.setDomStorageEnabled(true);    
  5. webSettings.setDatabaseEnabled(true);  
  6. webSettings.setAppCacheEnabled(true);   
  7. webSettings.setAllowFileAccess(true);  
  8. webSettings.setSavePassword(true);  
  9. webSettings.setSupportZoom(true);  
  10. webSettings.setBuiltInZoomControls(true);   
  11.    
  12. webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);  
  13. webSettings.setUseWideViewPort(true);   
  14.   
  15. mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);  
  16. mWebView.setHorizontalScrollbarOverlay(true);  
  17. mWebView.setHorizontalScrollBarEnabled(true);  
  18. mWebView.requestFocus();
      2、設置WebChromeClient子類       WebChromeClient會在一些影響瀏覽器ui交互動作發生時被調用,比如WebView關閉和隱藏、頁面加載進展、js確認框和警告框、js加載前、js操作超時、webView獲得焦點等等

 mWebView.setWebChromeClient(new MyWebChromeClient());

3、設置WebViewClient子類      WebViewClient會在一些影響內容渲染的動作發生時被調用,比如表單的錯誤提交需要重新提交、頁面開始加載及加載完成、資源加載中、接收到https認證需要處理、頁面鍵盤響應、頁面中的url打開處理等等

 

 

mWebView.setWebViewClient(new MyWebViewClient());  
4、設置addJavascriptInterface方法      使Js調用Native本地Java對象,實現本地Java代碼和HTML頁面進行交互,      注意:因爲安全問題的考慮 Google在使用Android API 17以上的版本的時候 需要通過@JavascriptInterface來註解的Java函數才能被識別可以被Js調用。

 

三、設置當前網頁的鏈接仍在WebView中跳轉,而不是跳到手機瀏覽器裏顯示,        在WebViewClient的子類中重寫shouldOverrideUrlLoading函數  代碼如下: 

  1.     webView.setWebViewClient(new WebViewClient() {
  2.     @Override    
  3.     public boolean shouldOverrideUrlLoading(WebView view, String url)    
  4.         view.loadUrl(url);    
  5.         return true   
  6.        
  7. });   
shouldOverrideUrlLoading表示當前webView中的一個新url需要加載時,給當前應用程序一個處理機會,如果沒有重寫此函數,webView請求ActivityManage選擇合適的方式處理請求,就像彈出uc和互聯網讓用戶選擇瀏覽器一樣。重寫後return true表示讓當前程序處理,return false表示讓當前webView處理 四、設置開始加載網頁、加載完成、加載錯誤時處理    在WebViewClient子類中分別重寫如下父類函數  代碼如下: 
  1. webView.setWebViewClient(new WebViewClient()    
  2.     
  3.     @Override  
  4.     public void onPageStarted(WebView view, String url, Bitmap favicon)  
  5.         super.onPageStarted(view, url, favicon);  
  6.         // 開始加載網頁時處理 如:顯示"加載提示" 的加載對話框  
  7.         DialogManager.showLoadingDialog(this);  
  8.      
  9.   
  10.     @Override  
  11.     public void onPageFinished(WebView view, String url)  
  12.         super.onPageFinished(view, url);  
  13.         // 網頁加載完成時處理  如:讓 加載對話框 消失  
  14.         DialogManager.dismissLoadingDialog();  
  15.      
  16.   
  17.     @Override  
  18.     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)  
  19.         super.onReceivedError(view, errorCode, description, failingUrl);  
  20.         // 加載網頁失敗時處理  如:  
  21.         view.loadDataWithBaseURL(null 
  22.                 "網頁加載失敗" 
  23.                 "text/html" 
  24.                 "utf-8" 
  25.                 null);  
  26.        
  27. });  
五、處理https請求,爲WebView處理ssl證書設置     WebView默認是不處理https請求的,頁面顯示空白,需要進行如下設置     在WebViewClient子類中重寫父類的onReceivedSslError函數  代碼如下:
  1. webView.setWebViewClient(new WebViewClient()    
  2.     
  3.     @Override  
  4.     public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)  
  5.         handler.proceed();  // 接受信任所有網站的證書  
  6.         // handler.cancel();   // 默認操作 不處理  
  7.         // handler.handleMessage(null);  // 可做其他處理  
  8.       
  9. });   

六、顯示頁面加載進度    在WebChromeClient子類中重寫父類的onProgressChanged函數  代碼如下:
  1. webView.setWebChromeClient(new WebChromeClient()    
  2.     
  3.     public void onProgressChanged(WebView view, int progress)    
  4.         setTitle("頁面加載中,請稍候..." progress "%");    
  5.         setProgress(progress 100);    
  6.     
  7.         if (progress == 100   
  8.             setTitle(R.string.app_name);    
  9.            
  10.        
  11. });  
onProgressChanged通知應用程序當前頁面加載的進度 progress表示當前頁面加載的進度,爲1至100的整數 七、back鍵控制網頁後退    Activity默認的back鍵處理爲結束當前Activity,WebView查看了很多網頁後,希望按back鍵返回上一次瀏覽的頁面,這個時候我們就需要覆蓋WebView所在Activity的onKeyDown函數,告訴他如何處理,代碼如下:
  1. public boolean onKeyDown(int keyCode, KeyEvent event)    
  2.     if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0   
  3.         webView.goBack();    
  4.         return true   
  5.        
  6.     return super.onKeyDown(keyCode, event);    
  7.  
其中webView.canGoBack()在webView含有一個可後退的瀏覽記錄時返回true webView.goBack();表示返回至webView的上次訪問頁面。

八、使用addJavascriptInterface完成和js交互 1、Js中調Native本地Java方法   設置webView的addJavascriptInterface方法,該方法有兩個參數,第一個參數爲被綁定到js中的類實例,第二個參數爲在js中暴露的類別名,在js中引用java對象就是用這個名字 在Native Java代碼如下:

  1. mWebView.getSettings().setJavaScriptEnabled(true);  
  2. mWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android");  
  3.   
  4. class JavaScriptInterface{  
  5.   
  6.     Context mContext;  
  7.   
  8.       
  9.     JavaScriptInterface(Context c)  
  10.         mContext c;  
  11.      
  12.   
  13.       
  14.     @JavascriptInterface  
  15.     public void showToast(String toast)  
  16.         Log.d("TAG""Js Invoker Native Function");  
  17.         Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();  
  18.             
  19.           
  20.  
在HTML中Js調用Native方法 代碼如下:
  1. <</span>input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />  
  2.   
  3. <</span>script type="text/javascript">  
  4.     function showAndroidToast(toast)  
  5.         Android.showToast(toast);  
  6.      
  7. </</span>script>  
2、Java調Js方法 比如在HTML中有如下Js函數
  1. "text/javascript" 
  2.       function showAlert()  
  3.         alert("Be executed by Native");  
  4.      
  5.   
在Native調Js方法如下:
  1. mWebView.loadUrl("javascript:showAlert()");  

九、WebView緩存模式的設置 1、網頁數據緩存 當使用WebView加載HTML網頁時,會在我們data/應用package下生成database與cache兩個文件夾: 我們請求的Url記錄是保存在webviewCache.db裏,而url的內容是保存在webviewCache文件夾下. 五種緩存模式的設置setCacheMode: LOAD_CACHE_ONLY:  不使用網絡,只讀取本地緩存數據。 LOAD_DEFAULT:  根據cache-control決定是否從網絡上取數據。 LOAD_CACHE_NORMAL: API level 17中已經廢棄, 從API level 11開始作用同LOAD_DEFAULT模式。 LOAD_NO_CACHE: 不使用緩存,只從網絡獲取數據。 LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用緩存中的數據。 如示例代碼:
  1. WebSettings webSettings mWebView.getSettings();  
  2. webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);  //設置 緩存模式    
  3. // 開啓 DOM storage API 功能    
  4. webSettings.setDomStorageEnabled(true);    
  5. //開啓 database storage API 功能    
  6. webSettings.setDatabaseEnabled(true);    

2、H5緩存
通過setAppCacheEnabled(boolean flag)設置H5的緩存是否打開,默認關閉。
根據setAppCachePath(String appCachePath)提供的路徑,在H5使用緩存過程中生成的緩存文件。
通過setAppCacheMaxSize(long appCacheMaxSize)設置緩存最大容量。

如示例代碼:
  1. String cacheDirPath getCacheDir().getAbsolutePath()+ "/webViewCache " 
  2. WebSettings webSettings mWebView.getSettings();  
  3. //開啓 database storage API 功能    
  4. webSettings.setDatabaseEnabled(true);      
  5. //設置數據庫緩存路徑    
  6. webSettings.setDatabasePath(cacheDirPath);   
  7. //開啓Application H5 Caches 功能    
  8. webSettings.setAppCacheEnabled(true);   
  9. //設置Application Caches 緩存目錄    
  10. webSettings.setAppCachePath(cacheDirPath);  

十、加快HTML網頁加載完成速度     默認情況html代碼下載到WebView後,webkit開始解析網頁各個節點,發現有外部樣式文件或者外部腳本文件時,會異步發起網絡請求下載文件,但如果在這之前也有解析到image節點,那勢必也會發起網絡請求下載相應的圖片。在網絡情況較差的情況下,過多的網絡請求就會造成帶寬緊張,影響到css或js文件加載完成的時間,造成頁面空白loading過久。解決的方法就是告訴WebView先不要自動加載圖片,等頁面finish後再發起圖片加載。     故在WebView初始化時設置如下代碼:
  1. public void int ()  
  2.     if(Build.VERSION.SDK_INT >= 19 
  3.         webView.getSettings().setLoadsImagesAutomatically(true);  
  4.     else  
  5.         webView.getSettings().setLoadsImagesAutomatically(false);  
  6.      
  7.  
同時在WebView的WebViewClient子類中重寫onPageFinished()方法添加如下代碼:
  1. @Override  
  2. public void onPageFinished(WebView view, String url)  
  3.     if(!webView.getSettings().getLoadsImagesAutomatically())  
  4.         webView.getSettings().setLoadsImagesAutomatically(true);  
  5.      
  6.  
從上面的代碼,可以看出我們對系統API在19以上的版本作了兼容。因爲4.4以上系統在onPageFinished時再恢復圖片加載時,如果存在多張圖片引用的是相同的src時,會只有一個image標籤得到加載,因而對於這樣的系統我們就先直接加載。

十一、WebView硬件加速導致頁面渲染閃爍問題解決方法     關於Android硬件加速 開始於Android 3.0 (API level 11),在四個級別上開啓/關閉硬件加速     1、Application級別:爲整個應用程序開啓硬件加速,在AndroidManifest中加入如下配置

  1. <</span>application android:hardwareAccelerated="true" ...>  
     2、Activity級別:控制每個activity是否開啓硬件加速,只需在activity元素中添加android:hardwareAccelerated屬性即可
  1. <</span>activity android:hardwareAccelerated="true" ...>  
   3、Window級別:注:目前還不支持在Window級別上關閉硬件加速
  1. getWindow().setFlags(  
  2.     WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,  
  3.     WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);  
   4、View級別:運行時單個view硬件加速,目前Android還不支持在View級別開啓硬件加速  代碼如下:
  1. mView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);  
    

 

 [//TODO 關於Android硬件加速 小呂有時間會更詳細的單獨整理成一篇來做介紹       先提供學習地址:http://android.toolib.net/guide/topics/graphics/hardware-accel.html ]      我們開啓硬件加速後,WebView渲染頁面更加快速,拖動也更加順滑。但有個副作用就是容易會出現頁面加載白塊同時界面閃爍現象。解決這個問題的方法是設置WebView暫時關閉硬件加速 代碼如下:

  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)  
  2.     webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);  
  3.  
十二、其他注意事項:     1> 從網絡上下載html頁面的過程應放在工作線程(後臺線程)中     2> html下載成功後渲染出html的步驟應放在UI主線程,不然WebView加載網頁過程會容易報錯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章