Android WebView載入html5頁面執行個體教程

來源:互聯網
上載者:User

執行個體一:WebView載入html5實現炫酷引導頁面

大多數人都知道,一個APP的引導頁面還是挺重要的,不過要想通過原生的Android代碼做出一個非常炫酷的引導頁相對還是比較複雜的,正巧html5在製作炫酷動畫網頁方面比較給力,我們不妨先利用html5做出手機引導頁面,然後將其嵌入APP中。

  首先我們分析一下,都需要做哪些工作?

  1、製作html5引導頁面。

  2、把做好的頁面放入Android工程中assets檔案夾下。

  3、利用WebView載入asset檔案夾下的html檔案。

  4、在引導頁最後一頁的按鈕上捕捉點擊事件,結束引導頁,進入程式。

  簡單的講,整個工作就分以上四步,其中涉及到了Android中一個內建的瀏覽器控制項--WebView,在介紹引導頁之前,先來大體說一下WebView的基本用法。

一、使用WebView瀏覽網頁

  用WebView瀏覽網頁,這是最常用也是最簡單的用法,與普通的ImageView組件的用法基本相似,它也提供了大量方法來執行瀏覽器操作,常用的幾個如下:

  ·void goBack():後退。

  ·void goForward():前進。

  ·void loadUrl(String url):載入url網頁。

  ·boolean zoomIn():放大網頁。

  ·boolean zoomOut():縮小網頁。

  ……

  下面看一個例子,通過WebView瀏覽百度首頁,效果圖如下。



  首先不要忘了在AndroidMainfest.xml加入訪問網路的許可權:

<uses-permission android:name="android.permission.INTERNET"/>


  布局檔案如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/container"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <WebView        android:id="@+id/wv_webview"        android:layout_width="fill_parent"        android:layout_height="fill_parent" /></LinearLayout>


   java代碼如下:

public class WebViewLoadWeb extends Activity {    WebView webView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.webview);        webView = (WebView)findViewById(R.id.wv_webview);        loadWeb();    }    public void loadWeb(){        String url = "https://www.baidu.com/";        //此方法可以在webview中開啟連結而不會跳轉到外部瀏覽器        webView.setWebViewClient(new WebViewClient());        webView.loadUrl(url);    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {            //重寫onKeyDown,當瀏覽網頁,WebView可以後退時執行後退操作。        if(keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()){            webView.goBack();            return true;        }         return super.onKeyDown(keyCode, event);    }}


  上面代碼首先載入布局檔案中WebView視圖,然後通過setWebViewClient()方法設定了開啟新串連不會跳轉到外部瀏覽器。最後通過loadUrl()方法載入了網址。至於該WebView如何發送請求,如何解析伺服器,這些細節對我們來說是完全透明的,我們不需要關心。

  另外需要一提的是,當使用WebView瀏覽網頁時,不做處理的話,按下手機的返回鍵會直接結束WebView所在的Activity,通過重寫onKeyDown()方法,當WebView可以返回時,讓其執行返回操作。

二、使用WebView載入HTML代碼。

  WebView提供了一個loadData(String data, String mimeType, String encoding)方法,該方法可用於載入並顯示HTML代碼,不過這個方法在載入html代碼時很可能會出現亂碼的現象。建議用WebView的另一個方法loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)。可以把這個方法認為是loadData()的增強版,它不會產生亂碼。以下是他的幾個參數說明:

  ·data:指定需要載入的html代碼。

  ·mimeType:指定html代碼的MIME類型,對於HTML代碼可指定為text/html。

  ·encoding:指定html代碼編碼所用的字元集。

  下面看一個使用WebView載入html代碼的簡單一實例,效果圖如下:


java代碼如下:

public void loadHtmlData(){        String data = "<html>"                + "<head>"                + "<title>歡迎您</title>"                + "</head>"                + "<body>"                + "<p>我是一段html代碼</p>"                + "</body>"                + "</html>";        webView.setWebViewClient(new WebViewClient());        //使用簡單的loadData()方法總會導致亂碼,有可能是Android API的Bug        //webView.loadData(data, "text/html", "GBK");        webView.loadDataWithBaseURL(null, data, "text/html", "utf-8", null);}


  上面代碼很簡單,就是用loadDataWithBaseURL()方法載入html代碼,在這裡就不過多介紹了。

  下面進入本篇介紹的重點,通過載入本地html檔案實現炫酷引導頁。

三、載入本地HTML檔案實現炫酷引導頁。

接下來為本篇重點,通過載入H5的方式可以很輕鬆做出炫酷的引導頁,當然前提時你得先做出或者找到一個很好H5引導頁檔案。需要說明的都已經在文章開頭說過了,就不廢話了,先上效果圖:


相信不用我解釋大家就能看懂,最左邊的是第一張頁面,中間的是過度動畫效果,最右邊的是最後一張,其中在最後一張上面有個按鈕,捕捉到這個按鈕的跳轉連結是關鍵。下面先來看代碼(html檔案在assets檔案夾下):

public class WebViewLoadHtml extends Activity {    private String url;    WebView webView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //將螢幕設定為全屏        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);        //去掉標題列        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.webview);        webView = (WebView)findViewById(R.id.wv_webview);        url = "file:///android_asset/guide/index.html";        loadLocalHtml(url);    }        @SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })    public void loadLocalHtml(String url){        WebSettings ws = webView.getSettings();        ws.setJavaScriptEnabled(true);//開啟JavaScript支援        webView.setWebViewClient(new WebViewClient(){            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                //重寫此方法,用於捕捉頁面上的跳轉連結                if ("http://start/".equals(url)){                    //在html代碼中的按鈕跳轉地址需要同此地址一致                    Toast.makeText(getApplicationContext(), "開始體驗", Toast.LENGTH_SHORT).show();                    finish();                }                 return true;            }        });        webView.loadUrl(url);    }}


  上面代碼首先將程式設為全屏無標題列,這樣才更像引導頁(註:截圖中沒有全屏是應為使用剪取工具時喚出了狀態列)。需要注意的是當載入具有js的檔案時需通過WebSettings的setJavaScriptEnabed()方法開啟對js的支援。然後通過setWebViewClient()重寫shouldOverrideUrlLoading()方法,具體用法源碼注釋中已給出。

  其中用到html檔案的按鈕跳轉連結的源碼如下:

<div class="swiper-slide">       <span>第三頁</span>       <span class="subtitle">這是第三頁</span>       <a href="javascript:" onClick="window.open('http:start')" class="swiper_read_more">開啟APP之旅</a></div>



執行個體二:WebView從assets中載入html5頁面,實現地理位置定位

今天調研一個html5頁面的定位問題,發現在手機瀏覽器上html5是可以實現定位的,但是在webview中就無法定位了。而我居然以為html5的地理定位在webview中不可行。html5頁面內容如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><p id="demo">點擊這個按鈕,獲得您的座標:</p><button onclick="getLocation()">試一下</button><script>var x=document.getElementById("demo");function getLocation(){if (navigator.geolocation){navigator.geolocation.watchPosition(showPosition);}else{x.innerHTML="Geolocation is not supported by this browser.";}}function showPosition(position){x.innerHTML="Latitude: " + position.coords.latitude +"<br />Longitude: " + position.coords.longitude;}</script></body></html>



後來又在網上查了查,發現,需要設定一些東西。設定websetting的屬性:

webView.setWebViewClient(new WebViewClient());//webView.loadUrl("http://news.baidu.com/");webView.loadUrl("file:///android_asset/index.html");WebSettings webSettings = webView.getSettings();webSettings.setJavaScriptEnabled(true);/*** 以下部分可以不要*/// //啟用資料庫// webSettings.setDatabaseEnabled(true);// String dir = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();//// //啟用地理定位// webSettings.setGeolocationEnabled(true);// //設定定位的資料庫路徑// webSettings.setGeolocationDatabasePath(dir);/*** 此處很重要,必須要*///***最重要的方法,一定要設定,這就是出不來的主要原因webSettings.setDomStorageEnabled(true);webView.setWebChromeClient(new WebChromeClient(){//配置許可權(同樣在WebChromeClient中實現)@Overridepublic void onGeolocationPermissionsShowPrompt(String origin,Callback callback) {callback.invoke(origin, true, false);super.onGeolocationPermissionsShowPrompt(origin, callback);}});



問題解決!

特別試了試:

同時開啟網路和GPS可以定位,獲得的是經緯度資訊。

只開啟網路可以定位,只開啟GPS也可以定位。

關閉網路和GPS也可以定位。

由此可見,是由地理位置定位所得,只能獲得經緯度資訊。

若要獲得詳細的地址資訊,需要調用地圖API實現。如下所示:

緯度:116.40387397,經度:39.91488908 詳細地址:北京市天安門

聯繫我們

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