Android開發(fā)筆記之探秘WebView
概述:
一個(gè)顯示網(wǎng)頁的視圖。這個(gè)類是你可以滾動自己的Web瀏覽器或在你的Activity中簡單地顯示一些在線內(nèi)容的基礎(chǔ)。它使用了WebKit渲染引擎來顯示網(wǎng)頁,包括向前和向后導(dǎo)航的方法(通過歷史記錄),放大和縮小,執(zhí)行文本搜索等。
需要注意的是:為了讓你的應(yīng)用能夠使用WebView訪問互聯(lián)網(wǎng)和加載網(wǎng)頁,你必須添加Internet的權(quán)限在Android Manifest文件中:
<uses-permission android:name="android.permission.INTERNET" />
類結(jié)構(gòu):
java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.AbsoluteLayout ↳ android.webkit.WebView
常用方法:
WebSettings
|
getSettings()
獲取設(shè)置WebView的WebSettings對象。
|
void
|
setWebViewClient(WebViewClient client)
設(shè)置將接收各種通知和請求的WebViewClient。
|
void
|
setWebChromeClient(WebChromeClient client)
設(shè)置chrome處理。
|
說明:
WebSettings getSettings()獲取設(shè)置WebView的WebSettings對象。
WebSettings常用方法:
方法
|
說明
|
setAllowFileAccess
|
啟用或禁用WebView訪問文件數(shù)據(jù)
|
setBlockNetworkImage
|
是否顯示網(wǎng)絡(luò)圖像
|
setBuiltInZoomControls
|
設(shè)置是否支持縮放
|
setCacheMode
|
設(shè)置緩沖的模式
|
setDefaultFontSize
|
設(shè)置默認(rèn)的字體大小
|
setDefaultTextEncodingName
|
設(shè)置在解碼時(shí)時(shí)候用的默認(rèn)編碼
|
setFixedFontFamily
|
設(shè)置固定使用的字體
|
setJavaScriptEnabled
|
設(shè)置是否支持Javascript
|
setLayoutAlgorithm
|
設(shè)置布局方式
|
setLightTouchEnabled
|
設(shè)置用鼠標(biāo)激活被選項(xiàng)
|
setSupportZoom
|
設(shè)置是否支持變焦
|
void setWebViewClient(WebViewClient client)
設(shè)置將接收各種通知和請求的WebViewClient。
WebViewClient 常用方法:
方法
|
說明
|
doUpdateVisitedHistory
|
更新歷史記錄
|
onFormResubmission
|
應(yīng)用程序重新請求網(wǎng)頁數(shù)據(jù)
|
onLoadResource
|
加載指定地址提供的資源
|
onPageFinished
|
網(wǎng)頁加載完畢
|
onPageStarted
|
網(wǎng)頁開始加載
|
onReceivedError
|
報(bào)告錯(cuò)誤信息
|
onScaleChanged
|
WebView發(fā)生改變
|
shouldOverrideUrlLoading
|
控制新的連接在當(dāng)前WebView中打開
|
void setWebChromeClient(WebChromeClient client) 設(shè)置chrome處理。
WebChromeClient常用方法:
方法
|
說明
|
onCloseWindow
|
關(guān)閉WebView
|
onCreateWindow
|
創(chuàng)建WebView
|
onJsAlert
|
處理Javascript中的Alert對話框
|
onJsConfirm
|
處理Javascript中的Confirm對話框
|
onJsPrompt
|
處理Javascript中的Prompt對話框
|
onProgressChanged
|
加載進(jìn)度條改變
|
onReceivedlcon
|
網(wǎng)頁圖標(biāo)更改
|
onReceivedTitle
|
網(wǎng)頁Title更改
|
onRequestFocus WebView
|
顯示焦點(diǎn)
|
自定義WebView,你可以添加你自己的行為:
創(chuàng)建和設(shè)置WebChromeClient子類。當(dāng)一些可能影響瀏覽器的用戶界面發(fā)生了,例如,進(jìn)度更新和JavaScript警報(bào)送到這里(見調(diào)試任務(wù))調(diào)用這個(gè)類。
創(chuàng)建和設(shè)置WebViewClient子類。當(dāng)影響內(nèi)容呈現(xiàn)的事情發(fā)生是調(diào)用這個(gè)類,例如,錯(cuò)誤或表單提交。您也可以攔截的URL加載到這里(通過shouldOverrideUrlLoading())。
修改WebSettings,如以setJavaScriptEnabled()方式啟用JavaScript。
將Java對象通過addJavascriptInterface(Object,String)方法注射到WebView。 這方法允許您將Java對象注入到一個(gè)頁面的JavaScript上下文,這樣他們可以通過JavaScript訪問的頁面。
下面是一個(gè)更加復(fù)雜的例子,顯示錯(cuò)誤處理,設(shè)置和進(jìn)展通知:
// Let's display the progress in the activity title bar, like the // browser appdoes. getWindow().requestFeature(Window.FEATURE_PROGRESS); webview.getSettings().setJavaScriptEnabled(true); final Activity activity = this; webview.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { //Activities and WebViews measure progress with different scales. //The progress meter will automatically disappear when we reach 100% activity.setProgress(progress * 1000); } }); webview.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show(); } }); webview.loadUrl("http://developer.android.com/");
縮放:
可以通過 設(shè)置 WebSettings.setBuiltInZoomControls(boolean) ,啟用內(nèi)置縮放。
注意:使用縮放,如果不是高度或?qū)挾仍O(shè)置為WRAP_CONTENT可能會導(dǎo)致不確定的行為,應(yīng)該避免。
Cookie 和窗口管理:
出于顯而易見的安全原因,您的應(yīng)用程序都有自己的緩存,cookie存儲等,它不共享瀏覽器應(yīng)用程序的數(shù)據(jù)。
默認(rèn)情況下,通過HTML請求打開新的窗口將被忽略。這是確切的它們是被JavaScript打開還是被目標(biāo)鏈接打開。您可以自定義您的WebChromeClient提供自己的行為打開多個(gè)窗口,并使用你想要的任何方式渲染它們。
WebView中構(gòu)建Web應(yīng)用程序:
如果你想提供一個(gè)Web應(yīng)用程序(或只是一個(gè)網(wǎng)頁)作為客戶端應(yīng)用程序的一部分,你可以使用WebView做到這一點(diǎn)。WebView類是Android的View類的一個(gè)擴(kuò)展,它可以讓你顯示網(wǎng)頁作為你的活動布局的一部分。它不包括一個(gè)完全開發(fā)的Web瀏覽器的任何功能,如導(dǎo)航控件或一個(gè)地址欄。所有的WebView默認(rèn)情況下是顯示一個(gè)Web頁面。
一個(gè)使用WebView的常見的場景:是當(dāng)你想要在你的應(yīng)用程序中提供可能需要更新的信息,如一個(gè)終端用戶協(xié)議或用戶指南,那么使用WebView是很有幫助的。 在你的Android應(yīng)用程序中你可以創(chuàng)建一個(gè)包含WebView的Activity然后用它來顯示的在線托管的文檔。
另一個(gè)使用WebView的常見的場景:是如果你的應(yīng)用程序提供的數(shù)據(jù)總是需要從Internet上獲取,如電子郵件。在這種情況下,你可能會發(fā)現(xiàn)它更容易在你的Android應(yīng)用程序,顯示所有的用戶數(shù)據(jù)的網(wǎng)頁,而不是執(zhí)行一個(gè)網(wǎng)絡(luò)請求,然后解析數(shù)據(jù),并渲染它在Android的布局,以建立一個(gè)WebView。相反,你可以設(shè)計(jì)的專為Android設(shè)備的網(wǎng)頁,然后實(shí)施的WebView在你的Android應(yīng)用程序加載的網(wǎng)頁。
下面將向你展示如何開始使用WebView,以及如何做一些額外的事情,比如在你的Android應(yīng)用程序中處理頁面導(dǎo)航和從網(wǎng)頁上綁定JavaScript到客戶端的代碼。
基本用法:
默認(rèn)情況下,WebView不提供類似瀏覽器的窗口小部件,不啟用JavaScript和網(wǎng)頁錯(cuò)誤被忽略。如果你的目的只是顯示一些HTML作為用戶界面的一部分,這也許還不錯(cuò);用戶將不再需要與網(wǎng)頁進(jìn)行交互閱讀,并且該網(wǎng)頁將不需要與用戶進(jìn)行交互。如果你需要一個(gè)全面的Web瀏覽器,那么你可能要調(diào)用瀏覽器應(yīng)用程序來加載URL,而不是用WebView中顯示它。例如:
1) 在你的APP中添加一個(gè)WebView:
<?xml version="1.0" encoding="utf-8"?> <WebView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" />
2) 使用loadUrl()方法加載一個(gè)web頁面:
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadUrl("http://www.example.com");
3) 給應(yīng)用程序添加訪問網(wǎng)絡(luò)的權(quán)限:
<manifest ... > <uses-permission android:name="android.permission.INTERNET" /> </manifest>
以上就是顯示一個(gè)最基本的web頁面所有的步驟。
在WebView中使用JavaScript :
如果你計(jì)劃在你的WebView加載網(wǎng)頁時(shí)使用JavaScript,你必須為你的WebView啟用JavaScript。一旦啟用JavaScript,你還可以創(chuàng)建你的應(yīng)用程序代碼和JavaScript代碼之間的接口。
JavaScript在WebView中默認(rèn)情況下是被禁用的。你可以通過附加在WebView上的WebSettings啟用它。即使用getSettings()獲取WebSettings ,然后啟用使用setJavaScriptEnabled()方法啟用JavaScript。
WebView myWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true);
JavaScript代碼綁定到Android代碼:
在開發(fā)一個(gè)web應(yīng)用程序,專門設(shè)計(jì)的WebView在你的Android應(yīng)用程序中,您可以創(chuàng)建您的JavaScript代碼和客戶端Android代碼之間的接口。例如,您的JavaScript代碼可以在你的Android代碼中調(diào)用一個(gè)方法來顯示Dialog,而不是使用JavaScriptalert()方法。
調(diào)用addJavascriptInterface()方法綁定一個(gè)新的JavaScript和Android代碼之間的接口。通過它 一個(gè)類實(shí)例綁定到你的JavaScrip,JavaScript可以調(diào)用一個(gè)接口名稱訪問類。
public class WebAppInterface { Context mContext; /** Instantiatethe interface and set the context */ WebAppInterface(Context c) { mContext = c; } /** Show a toastfrom the web page */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } }
注意:如果你設(shè)置的targetSdkVersion為17或更高,則必須添加@JavascriptInterface為任何您想要提供給您的JavaScript(該方法必須是public)方法添加標(biāo)注。如果你不提供注解,在Android4.2或更高版本上運(yùn)行時(shí)該方法是不能被網(wǎng)頁訪問的。
在上面這個(gè)例子中,WebAppInterface 類允許網(wǎng)頁調(diào)用showToast()方法創(chuàng)建一個(gè)Toast 消息。
你可以通過addJavascriptInterface()方法和Android接口名,綁定這個(gè)類到運(yùn)行在你的WebView中的JavaScript上。
WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), "Android");
這將為運(yùn)行在WebView中的JavaScript創(chuàng)建一個(gè)名為Android的接口。在這一點(diǎn)上,Web應(yīng)用程序可以訪問WebAppInterface類。例如,下面是一些HTML和JavaScript在單擊按鈕的時(shí)候?qū)?chuàng)建一個(gè)Toast消息。
<input type="button" value="Sayhello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } </script>
這不需要從JavaScript接口初始化Android。 WebView自動的將它應(yīng)用到你的web頁面中。 因此,按下按鈕showAndroidToast()方法使用Android接口調(diào)用WebAppInterface.showToast()方法。
注:綁定到你的JavaScript對象運(yùn)行在另一個(gè)線程,而不是在它構(gòu)建的線程。
警告:使用addJavascriptInterface()將允許 JavaScript來控制你的Android應(yīng)用程序。 這是一個(gè)非常有用的特性或危險(xiǎn)的安全問題。 當(dāng)WebView的HTML是不值得信任的(例如,部分或全部的HTML是由一個(gè)不知名的人或進(jìn)程提供的),那么攻擊將者執(zhí)行包括在HTML和選擇的任何客戶端代碼。因此,不應(yīng)該使用addJavascriptInterface()除非你寫的所有HTML和JavaScript出現(xiàn)在你WebView。 你應(yīng)該也不允許用戶導(dǎo)航到其他不是自己的網(wǎng)頁,,在你的WebView內(nèi)(相反,允許用戶的通過默認(rèn)瀏覽器應(yīng)用程序打開外部鏈接。應(yīng)用的web瀏覽器打開所有的URL鏈接,所以要小心你只有在處理頁面導(dǎo)航中描述以下部分)。
處理頁面導(dǎo)航:
當(dāng)用戶單擊在WebView上的鏈接時(shí),默認(rèn)行為是啟動一個(gè)處理URL的Android應(yīng)用。通常默認(rèn)網(wǎng)頁瀏覽器打開和裝在目的URL。但是你可以為WebView覆蓋這個(gè)行為,以便在你的WebView上打開鏈接。然后,您可以允許用戶前后瀏覽通過的由您的WebView保留的網(wǎng)頁歷史記錄。
要打開用戶點(diǎn)擊鏈接,只是提供一個(gè)WebViewClient為您的WebView,使用setWebViewClient()。
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.setWebViewClient(new WebViewClient());
這樣。用戶點(diǎn)擊的所有的鏈接,都在你的WebView上加載。
如果你想更多的控制點(diǎn)擊鏈接的加載,創(chuàng)建自己的WebViewClient的覆蓋shouldOverrideUrlLoading()方法。
private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (Uri.parse(url).getHost().equals("www.example.com")) { // This is my web site, so do not override;let my WebView load the page return false; } // Otherwise, the link is not for a page on my site, so launch anotherActivity that handles URLs Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } }
然后為WebView創(chuàng)建一個(gè)新的WebViewClient實(shí)例:
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.setWebViewClient(new MyWebViewClient());
現(xiàn)在,當(dāng)用戶點(diǎn)擊一個(gè)鏈接時(shí),系統(tǒng)調(diào)用shouldOverrideUrlLoading(),它會檢查URL主機(jī)是否一個(gè)特定的域相匹配(定義如上)。如果不匹配,那么為了不重寫的URL加載(它允許WebView加載的URL照常)方法返回false。如果URL中的主機(jī)不匹配,那么 一個(gè)Intent將被創(chuàng)建啟動默認(rèn)的Activity 處理URL(它可以解決用戶的默認(rèn)Web瀏覽器)。
瀏覽網(wǎng)頁的歷史記錄:
當(dāng)你的WebView重載URL加載的時(shí),WebView會自動累加訪問過的網(wǎng)頁的歷史記錄。您可以通過goBack()和 goForward()方法向后、向前瀏覽。
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Check if thekey event was the Back button and if there's history if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { myWebView.goBack(); return true; } // If it wasn'tthe Back key or there's no web page history, bubble up to the default // systembehavior (probably exit the activity) return super.onKeyDown(keyCode, event); }
如果有一個(gè)實(shí)際的網(wǎng)頁歷史記錄用戶訪問的canGoBack()方法返回true。同樣地,你可以使用canGoForward()來檢查是否有歷史前進(jìn)。如果不執(zhí)行此檢查,那么一旦用戶到達(dá)歷史的終結(jié),GoBack()或goForward()什么也不做。
相關(guān)文章
Android編程實(shí)現(xiàn)文字倒影效果的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)文字倒影效果的方法,涉及Android布局與圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2017-03-03Android LuBan與Compressor圖片壓縮方式
本篇文章主要介紹了Android LuBan與Compressor圖片壓縮方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04Android實(shí)現(xiàn)沉浸式通知欄通知欄背景顏色跟隨app導(dǎo)航欄背景顏色而改變
這篇文章主要介紹了Android實(shí)現(xiàn)沉浸式通知欄通知欄背景顏色跟隨app導(dǎo)航欄背景顏色而改變的相關(guān)資料,需要的朋友可以參考下2016-02-02一分鐘實(shí)現(xiàn)Android遮罩引導(dǎo)視圖
本文通過一分鐘的時(shí)間教大家實(shí)現(xiàn)Android遮罩引導(dǎo)視圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03Android實(shí)現(xiàn)濾鏡效果ColorMatrix
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)濾鏡效果ColorMatrix,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05Android 多種dialog的實(shí)現(xiàn)方法(推薦)
下面小編就為大家分享一篇Android 多種dialog的實(shí)現(xiàn)方法(推薦),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android AnalogClock簡單使用方法實(shí)例
這篇文章主要介紹了Android AnalogClock簡單使用方法,結(jié)合實(shí)例形式簡單分析了AnalogClock的布局調(diào)用技巧,需要的朋友可以參考下2016-01-01