android WebView解析

來源:互聯網
上載者:User

原文:WebView解析
http://www.eoeandroid.com/thread-233941-1-1.html

----------------------------------------------

phonegap+jquerymobile嘗鮮
http://www.eoeandroid.com/thread-234288-1-1.html

 

在 Android 手機中內建了一款高效能 webkit 核心瀏覽器, SDK 中封裝為一個叫做 WebView 組件。
WebView 類是 WebKit 模組 Java 層的視圖類,( 所有需要使用 網頁瀏覽功能的Android應用程式都要建立該視圖對象顯示和處理請求的網路資源。目前,WebKit 模組支援 HTTP、HTTPS、FTP 以及 javascript 請求。

WebView 作為應用程式的 UI 介面,為使用者提供了一系 列的網頁瀏覽、使用者互動介面,客戶程式通過這些介面訪問 WebKit 核心代碼。 )

什麼是 webkit
WebKit 是 Mac OS X v10.3 及以上版本所包含的軟體架構(對 v10.2.7 及以上版本也可通過 軟體更新擷取) 同時,
WebKit 也是 Mac OS X 的 Safari 網頁瀏覽器的基礎。WebKit 是一個開源項目,主要由 KDE 的 KHTML 修改而來並且包含了一些來自蘋果公司的一些組件。
傳統上, WebKit 包含一個網頁引擎 WebCore 和一個指令碼引擎 JavaScriptCore,它們分別對應 的是 KDE 的 KHTML 和 KJS。
不過,隨著 JavaScript 引擎的獨立性越來越強,現在 WebKit 和 WebCore 已經基本上混用不分(例如 Google Chrome 和 Maxthon 3 採用 V8引擎,卻仍然 宣稱自己是 WebKit 核心) 。
這裡我們初步體驗一下在 android 是使用 webview 瀏覽網頁,
SDK 的 Dev Guide 中有一個 在 WebView 的簡單例子 。 在開發過程中應該注意幾點: 1.AndroidManifest.xml 中必須使用許可"android.permission.INTERNET",否則會出 Web page not available 錯誤。

2.如果訪問的頁面中有 Javascript,則 webview 必須設定支援 Javascript。 webview.getSettings().setJavaScriptEnabled(true);
3.如果頁面中連結, 如果希望點選連結繼續在當前 browser 中響應, 而不是新開 Android 的系統browser 中響應該連結,必須覆蓋 webview 的 WebViewClient 對象。

mWebView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); mWebView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); 

4.如果不做任何處理,瀏覽網頁,點擊系統“Back”鍵,整個 Browser 會調用 finish()而結束自身,
  如果希望瀏覽的網 頁回退而不是推出瀏覽器,需要在當前 Activity 中處理並消費 掉該 Back 事件。

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

 ==========================================================================
在tomcat上放一個漂亮頁面

1.載入網頁(加許可權)
定義一個網址輸入文字框,點按鈕用webView開啟這個網頁
2.編寫data字串,webview.loadData(data,"text/html","UTF-8");
3.用dialog的setiem開啟網址,前進,後退,放大,縮小,清曆史。
4.用HTML定義開發介面。file:/android_asset/a.html

<script> function loadurl(){        }< /script>< select name="">  <option value=""/>  <option value=""/>< /select>webview.getSettings().setJavaScriptEnabled(true);webview.getSettings().setBuiltInZoomControls(true);webview.loadUrl(file:///...);

5.js對話方塊(用chom..)

function openAlert(){  window.alert("");}function openConfirm(){  if(window.confirm("是否刪除此資訊?")){          window.location="myjs.html";//-------------------!!!  }}<input type="submit" value="警告" onClick="openAlert()">< input type="submit" value="確認" onClick="openConfirm()">

-----------------------------------------------------
java調js中的方法:
//在java中調用javascript方法要通過loadUrl()來進行,把要調用的方法作為loadUrl方法的字串參數

settings.setJavaScriptEnabled(true);//設定在webview中可用js webview.loadUrl("javascript:myprompt1()");

javascript中調java中的方法:(特彆強調要用Android2.2版模擬器)

-------------java中:------

webview.addJavascriptInterface(new MyInterface(), "myobj");//第二步---註冊在js中調用的對象名myobj                  webview.loadUrl("file:///android_asset/test.html"); //第一步:定義要在js中調用的方法
    class MyInterface{
                   public String getname(){
                            return "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            }
    }

------------javascript中:-----

function myinterface(){                 document.getElementById("myname").innerHTML = window.myobj.getname() ;         }

------------------------------------------------------------------
WebView控制項功能強大,除了具有一般View的屬性和設定外,還可以對url請求、頁面載入、渲染、頁面互動進行強大的處理。
WebView有幾個可以定製的點:
(1)設定WebChromeClient子類,WebChromeClient會在一些影響瀏覽器ui互動動作發生時被調用,比如WebView關閉和隱藏、頁面載入進展、js確認框和警告框、js載入前、js操作逾時、webView獲得焦點等等,詳見WebChromeClient

(2)設定WebViewClient子類,WebViewClient會在一些影響內容喧嚷的動作發生時被調用,比如表單的錯誤提交需要重新提交、頁面開始載入及載入完成、資源載入中、接收到http認證需要處理、頁面鍵盤響應、頁面中的url開啟處理等等,詳見WebViewClient

(3)設定WebSettings類,其中包含多項配置。WebSettings用來對WebView的配置進行配置和管理,比如是否可以進行檔案操作、緩衝的設定、頁面是否支援放大和縮小、是否允許使用資料庫api、字型及文字編碼設定、是否允許js指令碼運行、是否允許圖片自動載入、是否允許資料及密碼儲存等等,詳見WebSettings

(4)設定addJavascriptInterface方法,將java對象綁定到webView中,以方便從頁面js中控制java對象, 實現用本地java代碼和html頁面進行互動,甚至可以進行頁面自動化。但如此做存在安全隱患,所以若設定了此方法,請確保webView的代碼都是自己完成,詳細使用addJavascriptInterface進行自動化見本文5使用addJavascriptInterface完成和js互動

1、back鍵控制網頁後退
Activity預設的back鍵處理為結束當前Activity,webView查看了很多網頁後,希望按back鍵返回上一次瀏覽的頁面,這個時候我們就需要覆蓋onKeyDown函數,告訴他如何處理,如下:

public  boolean onKeyDown(int keyCode, KeyEvent event) {           if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {               webView.goBack();               return    true;           }           return    super.onKeyDown(keyCode, event);       }   

其中webView.canGoBack()在webView含有一個可後退的瀏覽記錄時返回true
webView.goBack();表示返回webView的上次訪問頁面
WebView(網路視圖)能載入顯示網頁,可以將其視為一個瀏覽器。

網路內容:
1、LoadUrl直接顯示網頁內容(單獨顯示網狀圖片)

2、LoadData顯示中文網頁內容(含空格的處理)

APK包內檔案:
1、LoadUrl顯示APK中Html和圖片檔案

2、LoadData(loadDataWithBaseURL)顯示APK中圖片和文字混合的Html內容res/layout/main.xml
----------------------------------------------------------
當運行提示為web page not available時去資訊清單檔中添加許可權
<uses-permission android:name="android.permission.INTERNET"/>
URLUtil.isNetworkUrl(String uri)方法用來判斷使用者輸入的URL是否有效,如無效則會顯示一個Toast資訊框來提醒使用者輸入正確的URL

----------------------------------------------------------
步驟:
1、在布局檔案中聲明WebView
2、在Activity中執行個體化WebView
3、調用WebView的loadUrl( )方法,設定WevView要顯示的網頁
4、為了讓WebView能夠響應超連結功能,調用setWebViewClient( )方法,設定  WebView視圖
5、用WebView點連結看了很多頁以後為了讓WebView支援回退功能,需要覆蓋覆蓋Activity類的onKeyDown()方法,如果不做任何處理,點擊系統回退鍵,整個瀏覽器會調用finish()而結束自身,而不是回退到上一頁面
6、需要在AndroidManifest.xml檔案中添加許可權,否則出現Web page not available錯誤。

<uses-permission android:name="android.permission.INTERNET"/>
下面是具體的例子:

MainActivity.java

View Code

package com.android.webview.activity; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity {     private WebView webview;     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         webview = (WebView) findViewById(R.id.webview);         //設定WebView屬性,能夠執行Javascript指令碼         webview.getSettings().setJavaScriptEnabled(true);         //載入需要顯示的網頁         webview.loadUrl("http://www.8way.com/");         //設定Web視圖         webview.setWebViewClient(new HelloWebViewClient ());     }           @Override     //設定回退     //覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法     public boolean onKeyDown(int keyCode, KeyEvent event) {         if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {             webview.goBack(); //goBack()表示返回WebView的上一頁面             return true;         }         return false;     }           //Web視圖     private class HelloWebViewClient extends WebViewClient {         @Override         public boolean shouldOverrideUrlLoading(WebView view, String url) {             view.loadUrl(url);             return true;         }     } }

main.xml

View Code

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     >        <WebView           android:id="@+id/webview"         android:layout_width="fill_parent"         android:layout_height="fill_parent"         /> </LinearLayout> 在AndroidManifest.xml檔案中添加許可權 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"       package="com.android.webview.activity"       android:versionCode="1"       android:versionName="1.0">     <uses-sdk android:minSdkVersion="10" />     <application android:icon="@drawable/icon" android:label="@string/app_name">         <activity android:name=".MainActivity"                   android:label="@string/app_name">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>     </application>     <uses-permission android:name="android.permission.INTERNET"/> </manifest>

=======================================================
webview學習記錄總結:

首先要在 manifest.main 檔案中建立一個 webview,
然後再 activity 中定義這個 webview 然後 進行以下相關操作。
1、添加許可權:AndroidManifest.xml 中必須使用許可"android.permission.INTERNET",否則會出 Web page not available 錯誤。
2、在要Activity 中產生一個 WebView 組件:WebView webView = new WebView(this);
3、設定WebView 基本資料:
如果訪問的頁面中有 Javascript,則 webview 必須設定支援 Javascript。
webview.getSettings().setJavaScriptEnabled(true);
觸摸焦點起作用 requestFocus(); 取消捲軸 this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
4 如果希望點選連結由自己處理,而不是新開 Android 的系統 browser 中響應該連結。
給 WebView添加一個事件監聽對象( WebViewClient)並重寫其中的一些方法:
shouldOverrideUrlLoading:對網頁中超連結按鈕的響應。當按下某個串連時 WebViewClient會調用這個方法,
並傳遞參數:按下的 url onLoadResource onPageStart onPageFinish onReceiveError onReceivedHttpAuthRequest

5、如果訪問的頁面中有 Javascript,則 webview 必須設定支援 Javascript ,否則顯示空白頁面。
Java 代碼 webview.getSettings().setJavaScriptEnabled(true);

6、如果頁面中連結,如果希望點選連結繼續在當前 browser 中響應,而不是新開 Android 的系統 browser 中響應該連結,必須覆蓋 webview 的 WebViewClient 對象: Java 代碼 1.mWebView.setWebViewClient(new WebViewClient(){ 2. 3. 4. 5. 6. });
上述方法告訴系統由我這個 WebViewClient 處理這個 Intent,我來載入 URL。 點擊一個連結的 Intent 是向上冒泡的,
shouldOverrideUrlLoading 方法 return true 表示我載入後這個 Intent 就消費了, 不再向上冒泡了。

7、 如果不做任何處理, 在顯示你的 Brower UI 時, 點擊系統“Back”鍵, 整個 Browser 會作為一個整體“Back" }
public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true;
到其他 Activity 中,而不是希望的在 Browser 的曆史頁面中 Back。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.