Android--webView嵌套網頁

來源:互聯網
上載者:User

標籤:

webView嵌套網頁

因為某種原因,我們總是需要展示一些複雜的文本,Html.fromHtml()已經不能滿足我們的需求,比如後台可編輯的文本在最上層顯示起來比較吃力,所以為瞭解決一些複雜的文本顯示就需要用到WebView。

通過phongGap或者extjs jquery mobile等等的移動開發平台開發
其原理就是將一個用HTML5開發的程式通過各種平台打包成apk ios winPhone等等的平台的應用

WebView 主要調用三個方法:LoadUrl、LoadData、LoadDataWithBaseURL.
  1、LoadUrl            直接載入網頁、圖片並顯示.(本地或是網路上的網頁、圖片、gif)
  2、LoadData           顯示文字與圖片內容 (模擬器1.5、1.6)
  3、LoadDataWithBase  顯示文字與圖片內容(支援多個模擬器版本)

1.WebView

   在使用WebView控制項時,首先需要在xml布局檔案中定義一個WebView控制項,定義的方法如下:

這裡是要有網路許可權的

 

<WebView    android:id="@+id/webView"   android:layout_width="match_parent"   android:layout_height="match_parent"/>

(1)anGoBack()                   判斷是否能夠從該網頁返回上一個開啟的網頁

(2)getTitle()、getUrl()        獲得當前網頁的標題和URL路徑

(3)loadUrl(String url)         載入所要開啟的網頁等等。如下的代碼通過使用loadUrl()方法在WebView控制項中開啟了百度首頁。

    private WebView mWebView;    mWebView = (WebView)this.findViewById(R.id.webView);    mWebView.loadUrl("http://www.baidu.com/");

 2.WebSettings

   WebSettings用來設定WebView的屬性狀態。WebSettings和WebView存在於同一個生命週期中,可以使用如下的方法獲得WebSettings對象

  WebSettings webSettings = mWebView.getSettings();

 

在建立WebView時,系統會對WebView進行一些預設設定,當我們通過以上的方法得到WebSettings對象後,便可以從WebSettings對象中取出設定WebView的屬性和狀態

WebSettings提供的一些常用的設定WebView的屬性和狀態的方法如下:

  (1)setAllowFileAccess(boolean allow);        //設定啟用或禁止訪問檔案資料

  (2)setBuiltInZoomControls(boolean enabled);   //設定是否支援縮放

  (3)setDefaultFontSize(int size);            //設定預設的字型大小

  (4)setJavaScriptEnabled(boolean flag);       //設定是否支援JavaScript

  (5)setSupportZoom(boolean support);       //設定是否支援變焦

3.WebViewClient

WebViewClient主要用來輔助WebView處理各種通知、請求等事件。實現了讓新開啟的網頁在當前的WebView中進行顯示,而不是調用Android系統內建的瀏覽器進行訪問。

        webView.setWebViewClient(new WebViewClient() {            public boolean shouldOverrideUrlLoading(WebView view, String url) {                view.loadUrl(url);                //如果返回true用webView去開啟,為false調用系統瀏覽器或第三方瀏覽器。                return true;            }        });

 

 

我們可以通過WebView的setWebViewClient()方法,為WebView對象指定一個WebViewClient

        MyWebViewClient myWebViewClient = new MyWebViewClient();        mWebView.setWebViewClient(myWebViewClient);        private class MyWebViewClient extends WebViewClient {            //重寫父類方法,讓新開啟的網頁在當前的WebView中顯示            public boolean shouldOverrideUrlLoading(WebView view, String url) {                view.loadUrl(url);                return true;            }        }

可以看到,在如上的代碼中,我們通過在子類MyWebViewClient中重寫父類WebViewClient的shouldOverrideUrlLoading()方法,

在WebViewClient中同樣提供了很多的方法,比如以下一些:

  (1)doUpdateVisitedHistory(WebView view, String url, boolean isReload);             //更新記錄

  (2)onFormResubmission(WebView view, Message dontResend, Message resend);        //重新請求網頁資料

  (3)onLoadResource(WebView view, String url);                       //載入指定網址提供的資源

  (4)onPageFinished(WebView view, String url);                        //網頁載入完畢

  (5)onPageStarted(WebView view, String url, Bitmap favicon);               //網頁開始載入

  (6)onReceivedError(WebView view, int errorCode, String description, String failingUrl);  //報告錯誤資訊

4.WebChromeClient

WebChromeClient主要用來輔助WebView處理Javascript的對話方塊、網站表徵圖、網站標題以及網頁載入進度等。

同樣地,我們可以通過WebView的setWebChromeClient()方法,為WebView對象指定一個WebChromeClient。

在WebChromeClient中,

當網頁的載入進度發生變化時,onProgressChanged(WebView view, int newProgress)方法會被調用;

當網頁的表徵圖發生改變時,onReceivedIcon(WebView view, Bitmap icon)方法會被調用;

當網頁的標題發生改變時,onReceivedTitle(WebView view, String title)方法會被調用。

利用這些方法,我們便可以很容易的獲得網頁的載入進度、網頁的標題和表徵圖等資訊了,正如下面的代碼所示:

        MyWebChromeClient myWebChromeClient = new MyWebChromeClient();        mWebView.setWebChromeClient(myWebChromeClient);        private class MyWebChromeClient extends WebChromeClient {            //獲得網頁的載入進度,顯示在右上方的TextView控制項中            public void onProgressChanged(WebView view, int newProgress) {                if(newProgress < 100) {                    String progress = newProgress + "%";                    mTextView_progress.setText(progress);                } else {                    mTextView_progress.setText(" ");                }            }            //獲得網頁的標題,作為應用程式的標題進行顯示            public void onReceivedTitle(WebView view, String title) {                MainActivity.this.setTitle(title);            }        }

5.WebView與Javascript

  在WebView中不僅可以運行HTML代碼,更重要的是,WebView可以與Javascript互相調用。也就是說,在Javascript中可以擷取WebView的內容,與此同時,在WebView中也可以調用Javascript裡面的方法。

  下面就來說說如何在WebView中調用Javascript裡面的方法。

  這裡,我使用了百度地圖的API介面(一份內嵌了Javascript的HTML文檔),在該介面中提供如下的Javascript方法:

     /*********************************/     /*           尋找地點            */     /*********************************/     var city = new BMap.LocalSearch(map,{renderOptions:{map:map,autoViewport:true}});             function findPlace(place)     {         city.search(place);   }

 

 

   我們要做的就是在WebView中調用findPlace()方法,完成地點的尋找。在WebView中調用Javascript裡面的方法是通過代碼WebView.loadUrl(“javascript:方法名()”)來實現的。如下的代碼,從EditText控制項中獲得使用者想要尋找的地名,然後調用了Javascript中的findPlace()方法,進行尋找。

     public void onClick(View view) {         switch(view.getId()) {         case R.id.imagebutton_search:                    //尋找地名             String str = mEditText_input.getText().toString();             String url = "javascript:findPlace(‘" + str + "‘)";             mWebView.loadUrl(url);             break;         }     }

 

   比如,我們對“圓明園”進行尋找,可以看到2所示的尋找結果。 

 

 

 

WebView in ScrollView

我們都知道ScrollView和WebView都有滾動的效果,所以我們需要先屏蔽WebView的滾動事件

<ScrollView    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:descendantFocusability="blocksDescendants" >
中文亂碼

如果出現中文亂碼,你可以這樣設定

webView.loadData(body, "text/html; charset=utf-8", "utf-8");

 

Auto Scale

這時候如果後端如果傳過來的不是完整的Html,而是只有body部分的內容,那麼我們就需要補充並添加一些css樣式來達到自適應的效果。

WebView webView = new WebView(this);webView.setWebViewClient(new SimpleWebViewClient(title));        webView.getSettings().setDefaultTextEncodingName("utf-8");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {    webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING);} else {     webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);}webView.loadData(getHtmlData(body), "text/html; charset=utf-8", "utf-8");

 

別忘了頭部的設定:

private String getHtmlData(String bodyHTML) {    String head = "<head>" +                "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\"> " +                "<style>img{max-width: 100%; width:auto; height:auto;}</style>" +                "</head>";    return "<html>" + head + "<body>" + bodyHTML + "</body></html>";}

 

如何控制WebView的高度,沒想到WebView可以自己適應內容最長的高度。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Android--webView嵌套網頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.