【W(wǎng)ebView】WebView的基本使用

每個(gè)項(xiàng)目或簡(jiǎn)單或復(fù)雜的都會(huì)使用到WebView奶浦,那么這篇就對(duì)WebView的基本使用做一個(gè)簡(jiǎn)單的介紹。

WebView是什么际长,能做什么

官方類繼承結(jié)構(gòu).png

WebView是android提供的展示網(wǎng)頁(yè)的視圖想帅,基于這個(gè)類你可以在你的app內(nèi)啟動(dòng)網(wǎng)頁(yè)瀏覽器或者只是簡(jiǎn)單的展示在線的內(nèi)容。
WebView是一個(gè)基于webkit引擎队丝、展現(xiàn)web頁(yè)面的控件。Android的WebView在4.4之前是基于WebKit內(nèi)核實(shí)現(xiàn)的欲鹏,而4.4開始基于Chrome內(nèi)核實(shí)現(xiàn)机久。而Chrome所使用的WebKit內(nèi)核與之前WebView采用的WebKit內(nèi)核是不同的。

1. 首先赔嚎,要使用WebView吞加,自然創(chuàng)建一個(gè)WebView,創(chuàng)建的方式有兩種:

  • 在xml中:
<WebView
    android:id="@+id/web_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
  • 在java代碼中:
WebView view = new WebView(this);

2. 創(chuàng)建WebView尽狠,最基本的當(dāng)然是需要展示相關(guān)內(nèi)容,根據(jù)內(nèi)容來源可以采用不同的方法叶圃。

private String content = "<html>" +
            "<title>題目沒想好</title>"+
            "<h1>這只是一個(gè)測(cè)試頁(yè)面</h1>" +
            "<body>" +
            "<p>我開始選擇1種生活方式袄膏,培養(yǎng)1種思維,考慮承擔(dān)社會(huì)角色中的各種責(zé)任(現(xiàn)在的和未來的),開始養(yǎng)成1,2,3種習(xí)慣,而這其中還需要有很多細(xì)節(jié),這所有的一切來源于追求掺冠。</p>" +
            "<p><font color=\"red\"> 任重道遠(yuǎn)沉馆,至死方休码党。</font></p>" +
            "<p><a href=\"http://www.baidu.com\">眾里尋她千百度</a></p>"+
            "</body>" +
            "</html>";

/**
 * 加載一段html代碼的字符串
 * data 內(nèi)容字符串
 * mimeType  內(nèi)容的媒體類型
 * encoding 編碼類型
 */
wv.loadData(String data,String mimeType,String encoding);//方法原型
wv.loadData(content,"text/html","utf-8");//方法示例(錯(cuò)誤),如果不是英文和數(shù)字會(huì)有亂碼的問題斥黑,官方文檔說除了URL和base64以外揖盘,其他的聲明都是按照ascII來設(shè)置
wv.loadData(content,"text/html;charset=UTF-8",null);//方法示例,以這種方式會(huì)解決亂碼問題

/**
 * 這個(gè)方法我同樣用來加載一段html代碼的字符串
 */
wv.loadDataWithBaseURL(String baseUrl,String data,String mimeType,String encoding,String historyUrl);//方法原型
wv.loadDataWithBaseURL(null,content,"text/html","utf-8",null);//方法示例锌奴,同樣這種方式也沒有問題

wv.loadUrl(String url);//方法原型
wv.loadUrl("file:///android_asset/***.html");//方法示例兽狭,加載項(xiàng)目assets下的html頁(yè)面,html頁(yè)面自己定義鹿蜀,其他部分不變
wv.loadUrl("http://www.baidu.com");//方法示例箕慧,加載網(wǎng)頁(yè)

3. WebView將內(nèi)容顯示出來之后,你可能會(huì)發(fā)現(xiàn)效果跟自己想要的效果有些出入茴恰,那么怎么來對(duì)WebView進(jìn)行一些定制化的設(shè)置呢颠焦?這就不得不提到WebSettings類。

WebSettings.png

WebSettings是用來管理WebView設(shè)置的抽象類往枣。當(dāng)WebView第一次創(chuàng)建時(shí)伐庭,相應(yīng)包含一個(gè)WebSettings子類的對(duì)象,此WebSettings對(duì)象中有一套默認(rèn)的設(shè)置分冈,WebSettings對(duì)象的生命周期和其WebView的生命周期綁定圾另,如果WebView對(duì)象被銷毀,再去使用WebSettings的任何方法則會(huì)報(bào)錯(cuò)丈秩。

  • 看看WebSettings部分相關(guān)的具體使用方法
//獲取WebSettings對(duì)象
WebSettings webSettings = webView.getSettings();

//設(shè)置自適應(yīng)屏幕盯捌,兩者合用
webSettings.setUseWideViewPort(true); //將內(nèi)容調(diào)整到適合webview的大小 
webSettings.setLoadWithOverviewMode(true); // 縮放至屏幕的大小

//設(shè)置滾動(dòng)條
mWebView.setHorizontalScrollBarEnabled(false);//水平滾動(dòng)條不顯示
mWebView.setVerticalScrollBarEnabled(false); //垂直滾動(dòng)條不顯示

//縮放操作
webSettings.setSupportZoom(true); //支持縮放,默認(rèn)為true蘑秽〗戎可以不顯示設(shè)置,但是如果設(shè)置為false肠牲,則下面方法如何設(shè)置都不再支持縮放
webSettings.setBuiltInZoomControls(true); //設(shè)置內(nèi)置的縮放控件幼衰。若為false,則該WebView不可縮放
webSettings.setDisplayZoomControls(false); //隱藏原生的縮放控件缀雳,否則放大和縮小過程中會(huì)出現(xiàn)放大縮小圖標(biāo)渡嚣,雖然放大和縮小動(dòng)作結(jié)束后稍后就會(huì)消失,但是實(shí)在是有些丑

webSettings.setJavaScriptEnabled(true);  //如果訪問的頁(yè)面中要與Javascript交互肥印,則webview必須設(shè)置支持Javascript
webSettings.setAllowFileAccess(true); //設(shè)置可以訪問文件 识椰,比如當(dāng)網(wǎng)頁(yè)中存在文本文件時(shí)就可以打開查看

// 若加載的 html 里有JS 在執(zhí)行動(dòng)畫等操作,會(huì)造成資源浪費(fèi)(CPU深碱、電量)
// 在 onStop 和 onResume 里分別把 setJavaScriptEnabled() 給設(shè)置成 false 和 true 即可

//其他細(xì)節(jié)操作
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //關(guān)閉webview中緩存 
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口 
webSettings.setLoadsImagesAutomatically(true); //支持自動(dòng)加載圖片
webSettings.setDefaultTextEncodingName("utf-8");//設(shè)置編碼格式

4. 樣式也調(diào)好了腹鹉,如果仍然需要對(duì)WebView的內(nèi)部一些鏈接做處理、WebView的加載狀態(tài)甚至是具體的進(jìn)度敷硅,這時(shí)候就需要對(duì)WebViewClient類和WebChromeClient類做一些簡(jiǎn)單的了解了功咒。

這兩個(gè)類直接繼承自O(shè)bject愉阎。如果WebView只是用來處理一些html的頁(yè)面內(nèi)容,只用WebViewClient就行了力奋,如果需要更豐富的處理效果榜旦,比如Javascript 的對(duì)話框,網(wǎng)站圖標(biāo),網(wǎng)站標(biāo)題,進(jìn)度條處理等,就要用到WebChromeClient景殷。

  • WebViewClient代碼示例溅呢,主要說明處理WebView中的Uri的方法。
//盡管有些方法已經(jīng)廢棄滨彻,但是代替它的方法在API級(jí)別較高時(shí)才支持藕届,這樣的話還是選擇用之前的方法
wv.setWebViewClient(new WebViewClient(){ 
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {// 重寫此方法擊網(wǎng)頁(yè)里面的鏈接還是在當(dāng)前的webview里跳轉(zhuǎn),不跳到手機(jī)瀏覽器
             if(isHttpLink(url)){//同樣可以根據(jù)判斷具體的url類型來做不同的處理亭饵,比如電話號(hào)碼就可以跳轉(zhuǎn)手機(jī)的撥號(hào)頁(yè)面
                   view.loadUrl(url);
             }
             return true;
     }
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            //設(shè)定加載開始的動(dòng)作
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            //設(shè)定結(jié)束時(shí)的動(dòng)作休偶,比如需要等待webview加載完畢才顯示一些其他的布局或者加載框的消失
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)  {
            //出現(xiàn)錯(cuò)誤時(shí),根據(jù)錯(cuò)誤類型展示一個(gè)自定義的h5頁(yè)面或者錯(cuò)誤提示
        }
 });

//判斷url的類型
private boolean isHttpLink(String url) {
        if (url.startsWith("http:") || url.startsWith("https:")) {
            return true;
        }
        return false;
    }
  • WebChromeClient代碼示例
wv.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                if (newProgress < 100) {
                    String progress = newProgress + "%";
                } else {

                }
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                tvTitle.setText(title);
            }

            /**
             *告訴客戶端顯示一個(gè)JavaScript警告對(duì)話框辜羊。
             * 如果客戶端返回true踏兜,則WebView將假定客戶端將處理該對(duì)話框。
             * 如果客戶端返回false八秃,它將繼續(xù)執(zhí)行碱妆。
             */
            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                new AlertDialog.Builder(WebViewLoadActivity.this)
                        .setTitle("JsAlert")
                        .setMessage(message)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm();
                            }
                        })
                        .setCancelable(false)
                        .show();
                return true;

            }

            /**
             * 告訴客戶端向用戶顯示一個(gè)確認(rèn)對(duì)話框。
             * 如果客戶端返回true昔驱,WebView將假定客戶端將處理確認(rèn)對(duì)話框并調(diào)用相應(yīng)的JsResult方法疹尾。
             * 如果客戶端返回false,則默認(rèn)值false將返回到JavaScript骤肛。 默認(rèn)行為是返回false纳本。
             */
            @Override
            public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
                new AlertDialog.Builder(WebViewLoadActivity.this)
                        .setTitle("JsConfirm")
                        .setMessage(message)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm();
                            }
                        })
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.cancel();
                            }
                        })
                        .setCancelable(false)
                        .show();
                return true;
            }

            /**
             * 告訴客戶端向用戶顯示一個(gè)提示對(duì)話框。
             * 如果客戶端返回true腋颠,則WebView將假定客戶端將處理提示對(duì)話框并調(diào)用相應(yīng)的JsPromptResult方法繁成。
             * 如果客戶端返回false,則默認(rèn)值false將返回到j(luò)avascript淑玫。 默認(rèn)行為是返回false巾腕。
             */
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
                final EditText et = new EditText(WebViewLoadActivity.this);
                et.setText(defaultValue);
                new AlertDialog.Builder(WebViewLoadActivity.this)
                        .setTitle(message)
                        .setView(et)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm(et.getText().toString());
                            }
                        })
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.cancel();
                            }
                        })
                        .setCancelable(false)
                        .show();

                return true;
            }
        });

5. 銷毀WebView

//銷毀Webview,釋放資源
    @Override
    protected void onDestroy() {
        if (mWebview != null) {
            mWebview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            mWebview.clearHistory();
            ((ViewGroup) mWebview.getParent()).removeView(mWebview);
            mWebview.destroy();
            mWebview = null;
        }
        super.onDestroy();
    }

WebView的基本使用就先寫到這里絮蒿,這不是結(jié)束尊搬,而是開始!
對(duì)于WebView與js的互相調(diào)用土涝,雖然demo也寫了毁嗦,但是覺得有不錯(cuò)的博文,思路也很清晰回铛。傳送地址下面已放好狗准。

[參考博文]
http://www.reibang.com/p/3c94ae673e2a
http://www.reibang.com/p/345f4d8a5cfa

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茵肃,隨后出現(xiàn)的幾起案子腔长,更是在濱河造成了極大的恐慌,老刑警劉巖验残,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捞附,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡您没,警方通過查閱死者的電腦和手機(jī)鸟召,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氨鹏,“玉大人欧募,你說我怎么就攤上這事∑偷郑” “怎么了跟继?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)镣丑。 經(jīng)常有香客問我舔糖,道長(zhǎng),這世上最難降的妖魔是什么莺匠? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任金吗,我火速辦了婚禮,結(jié)果婚禮上趣竣,老公的妹妹穿的比我還像新娘摇庙。我一直安慰自己,他們只是感情好期贫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布跟匆。 她就那樣靜靜地躺著,像睡著了一般通砍。 火紅的嫁衣襯著肌膚如雪玛臂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天封孙,我揣著相機(jī)與錄音迹冤,去河邊找鬼。 笑死虎忌,一個(gè)胖子當(dāng)著我的面吹牛泡徙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膜蠢,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼堪藐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼莉兰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起礁竞,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤糖荒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后模捂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舅逸,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厦瓢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年犀概,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脾拆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岖食,死狀恐怖红碑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情县耽,我是刑警寧澤句喷,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站兔毙,受9級(jí)特大地震影響唾琼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澎剥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一锡溯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哑姚,春花似錦祭饭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绞佩,卻和暖如春寺鸥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背品山。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工胆建, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肘交。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓笆载,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凉驻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容