????????從Android 4.4(KitKat)開(kāi)始相满,原本基于WebKit的WebView開(kāi)始基于Chromium內(nèi)核廊驼,這一改動(dòng)大大提升了WebView組件的性能以及對(duì)HTML5,CSS3,JavaScript的支持涕烧。不過(guò)它的API卻沒(méi)有很大的改動(dòng),在兼容低版本的同時(shí)只引進(jìn)了少部分新的API,并不需要你做很大的改動(dòng)衰伯。
????????在WebView中箱叁,有幾個(gè)地方是我們可以使用來(lái)定制我們的WebView各種行為的墅垮,分別是:
- WebSettings
- JavaScriptInterface
- WebViewClient
- WebChromeClient。
WebView基本使用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
然后在Activity的onCreate方法里寫(xiě)入如下代碼:
String url = "https://www.google.com";
WebView webView = (WebView) findViewById(R.id.web_view);
webView.loadUrl(url);
接著在AndroidManifest聲明訪問(wèn)網(wǎng)絡(luò)的權(quán)限:
<uses-permission android:name="android.permission.INTERNET"/>
加載網(wǎng)頁(yè)的方式
-
loadData(String data, String mimeType, String encoding)
des:Load the given data into the WebView.
as:
String summary = "<html><body>You scored <b>192</b> points.</body></html>";
webview.loadData(summary, "text/html", null); -
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
des:Load the given data into the WebView, use the provided URL as the base URL for the content.
-
loadUrl(String url)
des:Load the given url.
as: webView.loadUrl("http://www.reibang.com/"); //加載網(wǎng)絡(luò)網(wǎng)頁(yè)
webView.loadUrl("file:///android_asset/html/index.html"); //加載本地assert目錄下網(wǎng)頁(yè)
webView.loadUrl("content://com.Android.htmlfileprovider/sdcard/kris.html"); // 加載SD卡html
-
loadUrl(String url, Map<String, String> extraHeaders)
Load the given url with the extra headers.
-
postUrl(String url, byte[] postData)
des: Loads the URL with postData using "POST" method into this WebView.
-
利用Intent調(diào)用系統(tǒng)瀏覽器
Uri uri = Uri.parse("http://www.reibang.com/");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
getSettings.setSupportZoom(false);//設(shè)置WebView是否支持使用屏幕控件或手勢(shì)進(jìn)行縮放耕漱,默認(rèn)是true算色,支持縮放。
getSettings.setMediaPlaybackRequiresUserGesture(false);// 設(shè)置WebView是否通過(guò)手勢(shì)觸發(fā)播放媒體螟够,默認(rèn)是true灾梦,需要手勢(shì)觸發(fā)。
getSettings.setBuiltInZoomControls(true); //
設(shè)置WebView是否使用其內(nèi)置的變焦機(jī)制妓笙,該機(jī)制集合屏幕縮放控件使用若河,默認(rèn)是false,不使用內(nèi)置變焦機(jī)制寞宫。
getSettings.setDisplayZoomControls(false); //
設(shè)置WebView使用內(nèi)置縮放機(jī)制時(shí)萧福,是否展現(xiàn)在屏幕縮放控件上,默認(rèn)true淆九,展現(xiàn)在控件上统锤。
getSettings.setAllowFileAccess(false); //
設(shè)置在WebView內(nèi)部是否允許訪問(wèn)文件,默認(rèn)允許訪問(wèn)炭庙。
getSettings.setAllowContentAccess(false); //
設(shè)置WebView是否使用其內(nèi)置的變焦機(jī)制饲窿,該機(jī)制結(jié)合屏幕縮放控件使用,默認(rèn)是false焕蹄,不使用內(nèi)置變焦機(jī)制逾雄。
getSettings.setLoadWithOverviewMode(false); //設(shè)置WebView是否使用預(yù)覽模式加載界面。
getSettings.setSaveFormData(false); //
設(shè)置WebView是否保存表單數(shù)據(jù),默認(rèn)true鸦泳,保存數(shù)據(jù)银锻。
getSettings.setTextZoom(100); //
設(shè)置WebView中加載頁(yè)面字體變焦百分比,默認(rèn)100做鹰,整型數(shù)击纬。
setAcceptThirdPartyCookies(boolean accept)
設(shè)置WebView訪問(wèn)第三方Cookies策略,參考CookieManager提供的方法:setShouldAcceptThirdPartyCookies钾麸。
getSettings.setAcceptThirdPartyCookies(false);setUseWideViewPort(boolean use)//設(shè)置WebView是否使用viewport更振,當(dāng)該屬性被設(shè)置為false時(shí),加載頁(yè)面的寬度總是適應(yīng)WebView控件寬度饭尝;當(dāng)被設(shè)置為true肯腕,當(dāng)前頁(yè)面包含viewport屬性標(biāo)簽,在標(biāo)簽中指定寬度值生效钥平,如果頁(yè)面不包含viewport標(biāo)簽实撒,無(wú)法提供一個(gè)寬度值,這個(gè)時(shí)候該方法將被使用涉瘾。
getSettings.setUseWideViewPort(false)知态;setSupportMultipleWindows(boolean support)
設(shè)置WebView是否支持多屏窗口,參考WebChromeClient#onCreateWindow立叛,默認(rèn)false肴甸,不支持。
getSettings.setSupportMultipleWindows(true);setLayoutAlgorithm(LayoutAlgorithm l)
設(shè)置WebView底層的布局算法囚巴,參考LayoutAlgorithm#NARROW_COLUMNS,將會(huì)重新生成WebView布局
getSettings.setLayoutAlgorithm(LayoutAlgorithm l)友扰;setStandardFontFamily(String font)
設(shè)置WebView標(biāo)準(zhǔn)字體庫(kù)字體彤叉,默認(rèn)字體“sans-serif”。
getSettings.setStandardFontFamily("sans-serif");setFixedFontFamily(String font)
設(shè)置WebView固定的字體庫(kù)字體村怪,默認(rèn)“monospace”秽浇。
getSettings.setFixedFontFamily("monospace");setSansSerifFontFamily(String font)
設(shè)置WebView Sans SeriFontFamily字體庫(kù)字體,默認(rèn)“sans-serif”甚负。
getSettings.setSansSerifFontFamily("sans-serif");setSerifFontFamily(String font)
設(shè)置WebView seri FontFamily字體庫(kù)字體柬焕,默認(rèn)“sans-serif”。
getSettings.setSansSerifFontFamily("sans-serif");setCursiveFontFamily(String font)
設(shè)置WebView字體庫(kù)字體梭域,默認(rèn)“cursive”
getSettings.setCursiveFontFamily("cursive");setFantasyFontFamily(String font)
設(shè)置WebView字體庫(kù)字體斑举,默認(rèn)“fantasy”。
getSettings.setFantasyFontFamily("fantasy");setMinimumFontSize(int size)
設(shè)置WebView字體最小值病涨,默認(rèn)值8富玷,取值1到72
getSettings.setMinimumFontSize(8);setMinimumLogicalFontSize(int size)
設(shè)置WebView邏輯上最小字體值,默認(rèn)值8,取值1到72
getSettings.setMinimumLogicalFontSize(8);setDefaultFontSize(int size)
設(shè)置WebView默認(rèn)值字體值赎懦,默認(rèn)值16雀鹃,取值1到72
getSettings.setDefaultFontSize(16);setDefaultFixedFontSize(int size)
設(shè)置WebView默認(rèn)固定的字體值,默認(rèn)值16励两,取值1到72
getSettings.setDefaultFixedFontSize(16);setLoadsImagesAutomatically(boolean flag)
設(shè)置WebView是否加載圖片資源黎茎,默認(rèn)true,自動(dòng)加載圖片
getSettings.setLoadsImagesAutomatically(false);setBlockNetworkImage(boolean flag)
設(shè)置WebView是否以http当悔、https方式訪問(wèn)從網(wǎng)絡(luò)加載圖片資源傅瞻,默認(rèn)false
getSettings.setBlockNetworkImage(true);setBlockNetworkLoads(boolean flag)
設(shè)置WebView是否從網(wǎng)絡(luò)加載資源,Application需要設(shè)置訪問(wèn)網(wǎng)絡(luò)權(quán)限先鱼,否則報(bào)異常
getSettings.setBlockNetworkLoads(true);setJavaScriptEnabled(boolean flag)
設(shè)置WebView是否允許執(zhí)行JavaScript腳本俭正,默認(rèn)false,不允許
getSettings.setJavaScriptEnabled(true);setAllowUniversalAccessFromFileURLs(boolean flag)
設(shè)置WebView運(yùn)行中的腳本可以是否訪問(wèn)任何原始起點(diǎn)內(nèi)容焙畔,默認(rèn)true
getSettings.setAllowUniversalAccessFromFileURLs(false);setAllowFileAccessFromFileURLs(boolean flag)
設(shè)置WebView運(yùn)行中的一個(gè)文件方案被允許訪問(wèn)其他文件方案中的內(nèi)容掸读,默認(rèn)值true
getSettings.setAllowFileAccessFromFileURLs(false);setGeolocationDatabasePath(String databasePath)
設(shè)置WebView保存地理位置信息數(shù)據(jù)路徑,指定的路徑Application具備寫(xiě)入權(quán)限
getSettings.setGeolocationDatabasePath(String path);
setAppCacheEnabled(boolean flag)
設(shè)置Application緩存API是否開(kāi)啟宏多,默認(rèn)false儿惫,設(shè)置有效的緩存路徑參考setAppCachePath(String path)方法
getSettings.setAppCacheEnabled(true);setAppCachePath(String appCachePath)
設(shè)置當(dāng)前Application緩存文件路徑,Application Cache API能夠開(kāi)啟需要指定Application具備寫(xiě)入權(quán)限的路徑
getSettings.setAppCachePath(String appCachePath);setDatabaseEnabled(boolean flag)
設(shè)置是否開(kāi)啟數(shù)據(jù)庫(kù)存儲(chǔ)API權(quán)限伸但,默認(rèn)false肾请,未開(kāi)啟,可以參考setDatabasePath(String path)
getSettings.setDatabaseEnabled(false);setDomStorageEnabled(boolean flag)
設(shè)置是否開(kāi)啟DOM存儲(chǔ)API權(quán)限更胖,默認(rèn)false铛铁,未開(kāi)啟,設(shè)置為true却妨,WebView能夠使用DOM storage API
getSettings.setDomStorageEnabled(true);setGeolocationEnabled(boolean flag)
設(shè)置是否開(kāi)啟定位功能饵逐,默認(rèn)true,開(kāi)啟定位
getSettings.setGeolocationEnabled(false);setJavaScriptCanOpenWindowsAutomatically(boolean flag)
設(shè)置腳本是否允許自動(dòng)打開(kāi)彈窗彪标,默認(rèn)false倍权,不允許
getSettings.setJavaScriptCanOpenWindowsAutomatically(true);setDefaultTextEncodingName(String encoding)
設(shè)置WebView加載頁(yè)面文本內(nèi)容的編碼,默認(rèn)“UTF-8”捞烟。
getSettings.setDefaultTextEncodingName("UTF-8");setUserAgentString(String ua)
設(shè)置WebView代理字符串薄声,如果String為null或?yàn)榭眨瑢⑹褂孟到y(tǒng)默認(rèn)值
getSettings.setUserAgentString(String ua);setNeedInitialFocus(boolean flag)
設(shè)置WebView是否需要設(shè)置一個(gè)節(jié)點(diǎn)獲取焦點(diǎn)當(dāng)被回調(diào)的時(shí)候题画,默認(rèn)true
getSettings.setNeedInitialFocus(false);setCacheMode(int mode)
重寫(xiě)緩存被使用到的方法默辨,該方法基于Navigation Type,加載普通的頁(yè)面婴程,將會(huì)檢查緩存同時(shí)重新驗(yàn)證是否需要加載廓奕,如果不需要重新加載抱婉,將直接從緩存讀取數(shù)據(jù),允許客戶(hù)端通過(guò)指定LOAD_DEFAULT桌粉、LOAD_CACHE_ELSE_NETWORK蒸绩、LOAD_NO_CACHE、LOAD_CACHE_ONLY其中之一重寫(xiě)該行為方法铃肯,默認(rèn)值LOAD_DEFAULT
getSettings.setCacheMode(WebSettings.LOAD_DEFAULT);setMixedContentMode(int mode)
設(shè)置當(dāng)一個(gè)安全站點(diǎn)企圖加載來(lái)自一個(gè)不安全站點(diǎn)資源時(shí)WebView的行為患亿,android.os.Build.VERSION_CODES.KITKAT默認(rèn)為MIXED_CONTENT_ALWAYS_ALLOW,android.os.Build.VERSION_CODES#LOLLIPOP默認(rèn)為MIXED_CONTENT_NEVER_ALLOW押逼,取值其中之一:MIXED_CONTENT_NEVER_ALLOW步藕、MIXED_CONTENT_ALWAYS_ALLOW、MIXED_CONTENT_COMPATIBILITY_MODE.
getSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
WebViewClient
從名字上不難理解挑格,這個(gè)類(lèi)就像WebView的委托人一樣咙冗,是幫助WebView處理各種通知和請(qǐng)求事件的,我們可以稱(chēng)他為WebView的“內(nèi)政大臣”漂彤。
onLoadResource(WebView view, String url):該方法在加載頁(yè)面資源時(shí)會(huì)回調(diào)雾消,每一個(gè)資源(比如圖片)的加載都會(huì)調(diào)用一次。
onPageStarted(WebView view, String url, Bitmap favicon):該方法在WebView開(kāi)始加載頁(yè)面且僅在Main frame loading(即整頁(yè)加載)時(shí)回調(diào)挫望,一次Main frame的加載只會(huì)回調(diào)該方法一次立润。我們可以在這個(gè)方法里設(shè)定開(kāi)啟一個(gè)加載的動(dòng)畫(huà),告訴用戶(hù)程序在等待網(wǎng)絡(luò)的響應(yīng)媳板。
onPageFinished(WebView view, String url):該方法只在WebView完成一個(gè)頁(yè)面加載時(shí)調(diào)用一次(同樣也只在Main frame loading時(shí)調(diào)用)桑腮,我們可以可以在此時(shí)關(guān)閉加載動(dòng)畫(huà),進(jìn)行其他操作蛉幸。
onReceivedError(WebView view, WebResourceRequest request, WebResourceError error):該方法在web頁(yè)面加載錯(cuò)誤時(shí)回調(diào)破讨,這些錯(cuò)誤通常都是由無(wú)法與服務(wù)器正常連接引起的,最常見(jiàn)的就是網(wǎng)絡(luò)問(wèn)題奕纫。 這個(gè)方法有兩個(gè)地方需要注意:
1.這個(gè)方法只在與服務(wù)器無(wú)法正常連接時(shí)調(diào)用添忘,類(lèi)似于服務(wù)器返回錯(cuò)誤碼的那種錯(cuò)誤(即HTTP ERROR),該方法是不會(huì)回調(diào)的若锁,因?yàn)槟阋呀?jīng)和服務(wù)器正常連接上了(全怪官方文檔(︶^︶));
2.這個(gè)方法是新版本的onReceivedError()方法斧吐,從API23開(kāi)始引進(jìn)又固,與舊方法onReceivedError(WebView view,int errorCode,String description,String failingUrl)不同的是,新方法在頁(yè)面局部加載發(fā)生錯(cuò)誤時(shí)也會(huì)被調(diào)用(比如頁(yè)面里兩個(gè)子Tab或者一張圖片)煤率。這就意味著該方法的調(diào)用頻率可能會(huì)更加頻繁仰冠,所以我們應(yīng)該在該方法里執(zhí)行盡量少的操作。
onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse):上一個(gè)方法提到onReceivedError并不會(huì)在服務(wù)器返回錯(cuò)誤碼時(shí)被回調(diào)蝶糯,那么當(dāng)我們需要捕捉HTTP ERROR并進(jìn)行相應(yīng)操作時(shí)應(yīng)該怎么辦呢洋只?API23便引入了該方法。當(dāng)服務(wù)器返回一個(gè)HTTP ERROR并且它的status code>=400時(shí),該方法便會(huì)回調(diào)识虚。這個(gè)方法的作用域并不局限于Main Frame肢扯,任何資源的加載引發(fā)HTTP ERROR都會(huì)引起該方法的回調(diào),所以我們也應(yīng)該在該方法里執(zhí)行盡量少的操作担锤,只進(jìn)行非常必要的錯(cuò)誤處理等蔚晨。
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error):當(dāng)WebView加載某個(gè)資源引發(fā)SSL錯(cuò)誤時(shí)會(huì)回調(diào)該方法,這時(shí)WebView要么執(zhí)行handler.cancel()取消加載肛循,要么執(zhí)行handler.proceed()方法繼續(xù)加載(默認(rèn)為cancel)铭腕。需要注意的是,這個(gè)決定可能會(huì)被保留并在將來(lái)再次遇到SSL錯(cuò)誤時(shí)執(zhí)行同樣的操作多糠。
WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request):當(dāng)WebView需要請(qǐng)求某個(gè)數(shù)據(jù)時(shí)累舷,這個(gè)方法可以攔截該請(qǐng)求來(lái)告知app并且允許app本身返回一個(gè)數(shù)據(jù)來(lái)替代我們?cè)疽虞d的數(shù)據(jù)。
比如你對(duì)web的某個(gè)js做了本地緩存夹孔,希望在加載該js時(shí)不再去請(qǐng)求服務(wù)器而是可以直接讀取本地緩存的js被盈,這個(gè)方法就可以幫助你完成這個(gè)需求。你可以寫(xiě)一些邏輯檢測(cè)這個(gè)request析蝴,并返回相應(yīng)的數(shù)據(jù)害捕,你返回的數(shù)據(jù)就會(huì)被WebView使用,如果你返回null闷畸,WebView會(huì)繼續(xù)向服務(wù)器請(qǐng)求尝盼。
boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request):哈~ 終于到了這個(gè)方法,在最開(kāi)始的基礎(chǔ)演示時(shí)我們用到了這個(gè)方法佑菩。從實(shí)踐中我們知道盾沫,當(dāng)我們沒(méi)有給WebView提供WebViewClient時(shí),WebView如果要加載一個(gè)url會(huì)向ActivityManager尋求一個(gè)適合的處理者來(lái)加載該url(比如系統(tǒng)自帶的瀏覽器)殿漠,這通常是我們不想看到的赴精。于是我們需要給WebView提供一個(gè)WebViewClient,并重寫(xiě)該方法返回true來(lái)告知WebView url的加載就在app中進(jìn)行绞幌。這時(shí)便可以實(shí)現(xiàn)在app內(nèi)訪問(wèn)網(wǎng)頁(yè)蕾哟。
onScaleChanged(WebView view, float oldScale, float newScale):當(dāng)WebView得頁(yè)面Scale值發(fā)生改變時(shí)回調(diào)。
boolean shouldOverrideKeyEvent(WebView view, KeyEvent event):默認(rèn)值為false莲蜘,重寫(xiě)此方法并return true可以讓我們?cè)赪ebView內(nèi)處理按鍵事件谭确。
WebChromeClient
如果說(shuō)WebViewClient是幫助WebView處理各種通知、請(qǐng)求事件的“內(nèi)政大臣”的話(huà)票渠,那么WebChromeClient就是輔助WebView處理Javascript的對(duì)話(huà)框逐哈,網(wǎng)站圖標(biāo),網(wǎng)站title问顷,加載進(jìn)度等偏外部事件的“外交大臣”昂秃。
onProgressChanged(WebView view, int newProgress):當(dāng)頁(yè)面加載的進(jìn)度發(fā)生改變時(shí)回調(diào)禀梳,用來(lái)告知主程序當(dāng)前頁(yè)面的加載進(jìn)度。
onReceivedIcon(WebView view, Bitmap icon):用來(lái)接收web頁(yè)面的icon肠骆,我們可以在這里將該頁(yè)面的icon設(shè)置到Toolbar算途。
onReceivedTitle(WebView view, String title):用來(lái)接收web頁(yè)面的title,我們可以在這里將頁(yè)面的title設(shè)置到Toolbar哗戈。
以下兩個(gè)方法是為了支持web頁(yè)面進(jìn)入全屏模式而存在的(比如播放視頻)郊艘,如果不實(shí)現(xiàn)這兩個(gè)方法,該web上的內(nèi)容便不能進(jìn)入全屏模式唯咬。
onShowCustomView(View view, WebChromeClient.CustomViewCallback callback):該方法在當(dāng)前頁(yè)面進(jìn)入全屏模式時(shí)回調(diào)纱注,主程序必須提供一個(gè)包含當(dāng)前web內(nèi)容(視頻 or Something)的自定義的View。
onHideCustomView():該方法在當(dāng)前頁(yè)面退出全屏模式時(shí)回調(diào)胆胰,主程序應(yīng)在這時(shí)隱藏之前show出來(lái)的View狞贱。
Bitmap getDefaultVideoPoster():當(dāng)我們的Web頁(yè)面包含視頻時(shí),我們可以在HTML里為它設(shè)置一個(gè)預(yù)覽圖蜀涨,WebView會(huì)在繪制頁(yè)面時(shí)根據(jù)它的寬高為它布局瞎嬉。而當(dāng)我們處于弱網(wǎng)狀態(tài)下時(shí),我們沒(méi)有比較快的獲取該圖片厚柳,那WebView繪制頁(yè)面時(shí)的gitWidth()方法就會(huì)報(bào)出空指針異常~ 于是app就crash了氧枣。。
這時(shí)我們就需要重寫(xiě)該方法别垮,在我們尚未獲取web頁(yè)面上的video預(yù)覽圖時(shí)便监,給予它一個(gè)本地的圖片,避免空指針的發(fā)生碳想。
View getVideoLoadingProgressView():重寫(xiě)該方法可以在視頻loading時(shí)給予一個(gè)自定義的View烧董,可以是加載圓環(huán) or something。
boolean onJsAlert(WebView view, String url, String message, JsResult result):處理Javascript中的Alert對(duì)話(huà)框胧奔。
boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result):處理Javascript中的Prompt對(duì)話(huà)框逊移。
boolean onJsConfirm(WebView view, String url, String message, JsResult result):處理Javascript中的Confirm對(duì)話(huà)框
boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams):該方法在用戶(hù)進(jìn)行了web上某個(gè)需要上傳文件的操作時(shí)回調(diào)。我們應(yīng)該在這里打開(kāi)一個(gè)文件選擇器龙填,如果要取消這個(gè)請(qǐng)求我們可以調(diào)用filePathCallback.onReceiveValue(null)并返回true胳泉。
onPermissionRequest(PermissionRequest request):該方法在web頁(yè)面請(qǐng)求某個(gè)尚未被允許或拒絕的權(quán)限時(shí)回調(diào),主程序在此時(shí)調(diào)用grant(String [])或deny()方法岩遗。如果該方法沒(méi)有被重寫(xiě)胶背,則默認(rèn)拒絕web頁(yè)面請(qǐng)求的權(quán)限。
onPermissionRequestCanceled(PermissionRequest request):該方法在web權(quán)限申請(qǐng)權(quán)限被取消時(shí)回調(diào)喘先,這時(shí)應(yīng)該隱藏任何與之相關(guān)的UI界面。
Js與WebView交互
既然嗨鳥(niǎo)應(yīng)用大行其道廷粒,那么毫無(wú)疑問(wèn)Android與JavaScript的交互我們也必須了解清楚窘拯,下面來(lái)介紹一下JavaScript與Android是如何互相調(diào)用的红且。
利用WebView調(diào)用網(wǎng)頁(yè)上的JavaScript代碼
在WebView中調(diào)用Js的基本格式為
webView.loadUrl("javascript:methodName(parameterValues)");
現(xiàn)有以下這段JavaScript代碼
function readyToGo() {
alert("Hello")
}
function alertMessage(message) {
alert(message)
}
function getYourCar(){
return "Car";
}
- WebView調(diào)用JavaScript無(wú)參無(wú)返回值函數(shù)
String call = "javascript:readyToGo()";
webView.loadUrl(call);
- WebView調(diào)用JavScript有參無(wú)返回值函數(shù)
String call = "javascript:alertMessage(\"" + "content" + "\")";
webView.loadUrl(call);
- WebView調(diào)用JavaScript有參數(shù)有返回值的函數(shù)
@TargetApi(Build.VERSION_CODES.KITKAT)
private void evaluateJavaScript(WebView webView){
webView.evaluateJavascript("getYourCar()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("findCar",s);
}
});
}
JavaScript通過(guò)WebView調(diào)用Java代碼
從API19開(kāi)始,Android提供了@JavascriptInterface對(duì)象注解的方式來(lái)建立起Javascript對(duì)象和Android原生對(duì)象的綁定涤姊,提供給JavScript調(diào)用的函數(shù)必須帶有@JavascriptInterface暇番。
演示一 JavaScript調(diào)用Android Toast方法
- 編寫(xiě)Java原生方法并用使用@JavascriptInterface注解
@JavascriptInterface
public void show(String s){
Toast.makeText(getApplication(), s, Toast.LENGTH_SHORT).show();
}
2.注冊(cè)JavaScriptInterface
webView.addJavascriptInterface(this, "android");
addJavascriptInterface的作用是把this所代表的類(lèi)映射為JavaScript中的android對(duì)象。
3.編寫(xiě)JavaScript代碼
function toastClick(){
window.android.show("JavaScript called~!");
}
演示二 JavaScript調(diào)用有返回值的Java方法
1.定義一個(gè)帶返回值的Java方法思喊,并使用@JavaInterface:
@JavaInterface
public String getMessage(){
return "Hello,boy~";
}
2.添加JavaScript的映射
webView.addJavaScriptInterface(this,"Android");
3.通過(guò)JavaScript調(diào)用Java方法
function showHello(){
var str=window.Android.getMessage();
console.log(str);
}
Android 中Webview 自適應(yīng)屏幕
//設(shè)置加載進(jìn)來(lái)的頁(yè)面自適應(yīng)手機(jī)屏幕
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
第一個(gè)方法設(shè)置webview推薦使用的窗口壁酬,設(shè)置為true。第二個(gè)方法是設(shè)置webview加載的頁(yè)面的模式恨课,也設(shè)置為true舆乔。
這方法可以讓你的頁(yè)面適應(yīng)手機(jī)屏幕的分辨率,完整的顯示在屏幕上剂公,可以放大縮小希俩。
WebView設(shè)置字體默認(rèn)大小
WebSettings settings = webView.getSettings();
settings.setDefaultFontSize(22);