Android webview詳解《1》

????????從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);

  1. getSettings.setSupportZoom(false);//設(shè)置WebView是否支持使用屏幕控件或手勢(shì)進(jìn)行縮放耕漱,默認(rèn)是true算色,支持縮放。

  2. getSettings.setMediaPlaybackRequiresUserGesture(false);// 設(shè)置WebView是否通過(guò)手勢(shì)觸發(fā)播放媒體螟够,默認(rèn)是true灾梦,需要手勢(shì)觸發(fā)。

  1. getSettings.setBuiltInZoomControls(true); //
    設(shè)置WebView是否使用其內(nèi)置的變焦機(jī)制妓笙,該機(jī)制集合屏幕縮放控件使用若河,默認(rèn)是false,不使用內(nèi)置變焦機(jī)制寞宫。

  1. getSettings.setDisplayZoomControls(false); //
    設(shè)置WebView使用內(nèi)置縮放機(jī)制時(shí)萧福,是否展現(xiàn)在屏幕縮放控件上,默認(rèn)true淆九,展現(xiàn)在控件上统锤。

  1. getSettings.setAllowFileAccess(false); //
    設(shè)置在WebView內(nèi)部是否允許訪問(wèn)文件,默認(rèn)允許訪問(wèn)炭庙。

  1. getSettings.setAllowContentAccess(false); //
    設(shè)置WebView是否使用其內(nèi)置的變焦機(jī)制饲窿,該機(jī)制結(jié)合屏幕縮放控件使用,默認(rèn)是false焕蹄,不使用內(nèi)置變焦機(jī)制逾雄。

  1. getSettings.setLoadWithOverviewMode(false); //設(shè)置WebView是否使用預(yù)覽模式加載界面。

  1. getSettings.setSaveFormData(false); //
    設(shè)置WebView是否保存表單數(shù)據(jù),默認(rèn)true鸦泳,保存數(shù)據(jù)银锻。

  1. getSettings.setTextZoom(100); //
    設(shè)置WebView中加載頁(yè)面字體變焦百分比,默認(rèn)100做鹰,整型數(shù)击纬。

  1. setAcceptThirdPartyCookies(boolean accept)
    設(shè)置WebView訪問(wèn)第三方Cookies策略,參考CookieManager提供的方法:setShouldAcceptThirdPartyCookies钾麸。
    getSettings.setAcceptThirdPartyCookies(false);

  2. 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)知态;

  3. setSupportMultipleWindows(boolean support)
    設(shè)置WebView是否支持多屏窗口,參考WebChromeClient#onCreateWindow立叛,默認(rèn)false肴甸,不支持。
    getSettings.setSupportMultipleWindows(true);

  4. setLayoutAlgorithm(LayoutAlgorithm l)
    設(shè)置WebView底層的布局算法囚巴,參考LayoutAlgorithm#NARROW_COLUMNS,將會(huì)重新生成WebView布局
    getSettings.setLayoutAlgorithm(LayoutAlgorithm l)友扰;

  5. setStandardFontFamily(String font)
    設(shè)置WebView標(biāo)準(zhǔn)字體庫(kù)字體彤叉,默認(rèn)字體“sans-serif”。
    getSettings.setStandardFontFamily("sans-serif");

  6. setFixedFontFamily(String font)
    設(shè)置WebView固定的字體庫(kù)字體村怪,默認(rèn)“monospace”秽浇。
    getSettings.setFixedFontFamily("monospace");

  7. setSansSerifFontFamily(String font)
    設(shè)置WebView Sans SeriFontFamily字體庫(kù)字體,默認(rèn)“sans-serif”甚负。
    getSettings.setSansSerifFontFamily("sans-serif");

  8. setSerifFontFamily(String font)
    設(shè)置WebView seri FontFamily字體庫(kù)字體柬焕,默認(rèn)“sans-serif”。
    getSettings.setSansSerifFontFamily("sans-serif");

  9. setCursiveFontFamily(String font)
    設(shè)置WebView字體庫(kù)字體梭域,默認(rèn)“cursive”
    getSettings.setCursiveFontFamily("cursive");

  10. setFantasyFontFamily(String font)
    設(shè)置WebView字體庫(kù)字體斑举,默認(rèn)“fantasy”。
    getSettings.setFantasyFontFamily("fantasy");

  11. setMinimumFontSize(int size)
    設(shè)置WebView字體最小值病涨,默認(rèn)值8富玷,取值1到72
    getSettings.setMinimumFontSize(8);

  12. setMinimumLogicalFontSize(int size)
    設(shè)置WebView邏輯上最小字體值,默認(rèn)值8,取值1到72
    getSettings.setMinimumLogicalFontSize(8);

  13. setDefaultFontSize(int size)
    設(shè)置WebView默認(rèn)值字體值赎懦,默認(rèn)值16雀鹃,取值1到72
    getSettings.setDefaultFontSize(16);

  14. setDefaultFixedFontSize(int size)
    設(shè)置WebView默認(rèn)固定的字體值,默認(rèn)值16励两,取值1到72
    getSettings.setDefaultFixedFontSize(16);

  15. setLoadsImagesAutomatically(boolean flag)
    設(shè)置WebView是否加載圖片資源黎茎,默認(rèn)true,自動(dòng)加載圖片
    getSettings.setLoadsImagesAutomatically(false);

  16. setBlockNetworkImage(boolean flag)
    設(shè)置WebView是否以http当悔、https方式訪問(wèn)從網(wǎng)絡(luò)加載圖片資源傅瞻,默認(rèn)false
    getSettings.setBlockNetworkImage(true);

  17. setBlockNetworkLoads(boolean flag)
    設(shè)置WebView是否從網(wǎng)絡(luò)加載資源,Application需要設(shè)置訪問(wèn)網(wǎng)絡(luò)權(quán)限先鱼,否則報(bào)異常
    getSettings.setBlockNetworkLoads(true);

  18. setJavaScriptEnabled(boolean flag)
    設(shè)置WebView是否允許執(zhí)行JavaScript腳本俭正,默認(rèn)false,不允許
    getSettings.setJavaScriptEnabled(true);

  19. setAllowUniversalAccessFromFileURLs(boolean flag)
    設(shè)置WebView運(yùn)行中的腳本可以是否訪問(wèn)任何原始起點(diǎn)內(nèi)容焙畔,默認(rèn)true
    getSettings.setAllowUniversalAccessFromFileURLs(false);

  20. setAllowFileAccessFromFileURLs(boolean flag)
    設(shè)置WebView運(yùn)行中的一個(gè)文件方案被允許訪問(wèn)其他文件方案中的內(nèi)容掸读,默認(rèn)值true
    getSettings.setAllowFileAccessFromFileURLs(false);

  21. setGeolocationDatabasePath(String databasePath)
    設(shè)置WebView保存地理位置信息數(shù)據(jù)路徑,指定的路徑Application具備寫(xiě)入權(quán)限

getSettings.setGeolocationDatabasePath(String path);

  1. setAppCacheEnabled(boolean flag)
    設(shè)置Application緩存API是否開(kāi)啟宏多,默認(rèn)false儿惫,設(shè)置有效的緩存路徑參考setAppCachePath(String path)方法
    getSettings.setAppCacheEnabled(true);

  2. setAppCachePath(String appCachePath)
    設(shè)置當(dāng)前Application緩存文件路徑,Application Cache API能夠開(kāi)啟需要指定Application具備寫(xiě)入權(quán)限的路徑
    getSettings.setAppCachePath(String appCachePath);

  3. setDatabaseEnabled(boolean flag)
    設(shè)置是否開(kāi)啟數(shù)據(jù)庫(kù)存儲(chǔ)API權(quán)限伸但,默認(rèn)false肾请,未開(kāi)啟,可以參考setDatabasePath(String path)
    getSettings.setDatabaseEnabled(false);

  4. 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);

  5. setGeolocationEnabled(boolean flag)
    設(shè)置是否開(kāi)啟定位功能饵逐,默認(rèn)true,開(kāi)啟定位
    getSettings.setGeolocationEnabled(false);

  6. setJavaScriptCanOpenWindowsAutomatically(boolean flag)
    設(shè)置腳本是否允許自動(dòng)打開(kāi)彈窗彪标,默認(rèn)false倍权,不允許
    getSettings.setJavaScriptCanOpenWindowsAutomatically(true);

  7. setDefaultTextEncodingName(String encoding)
    設(shè)置WebView加載頁(yè)面文本內(nèi)容的編碼,默認(rèn)“UTF-8”捞烟。
    getSettings.setDefaultTextEncodingName("UTF-8");

  8. setUserAgentString(String ua)
    設(shè)置WebView代理字符串薄声,如果String為null或?yàn)榭眨瑢⑹褂孟到y(tǒng)默認(rèn)值
    getSettings.setUserAgentString(String ua);

  9. setNeedInitialFocus(boolean flag)
    設(shè)置WebView是否需要設(shè)置一個(gè)節(jié)點(diǎn)獲取焦點(diǎn)當(dāng)被回調(diào)的時(shí)候题画,默認(rèn)true
    getSettings.setNeedInitialFocus(false);

  10. 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);

  11. 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";
  }
  1. WebView調(diào)用JavaScript無(wú)參無(wú)返回值函數(shù)
String call = "javascript:readyToGo()";
webView.loadUrl(call);
  1. WebView調(diào)用JavScript有參無(wú)返回值函數(shù)
String call = "javascript:alertMessage(\"" + "content" + "\")";
webView.loadUrl(call);
  1. 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方法

  1. 編寫(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);  

Android Webview總結(jié)
WebView·開(kāi)車(chē)指南

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纲辽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖庐橙,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琳水,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡吊档,警方通過(guò)查閱死者的電腦和手機(jī)篙议,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)籍铁,“玉大人涡上,你說(shuō)我怎么就攤上這事【苊” “怎么了吩愧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)增显。 經(jīng)常有香客問(wèn)我雁佳,道長(zhǎng),這世上最難降的妖魔是什么同云? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任糖权,我火速辦了婚禮,結(jié)果婚禮上炸站,老公的妹妹穿的比我還像新娘星澳。我一直安慰自己,他們只是感情好旱易,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布禁偎。 她就那樣靜靜地躺著腿堤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪如暖。 梳的紋絲不亂的頭發(fā)上笆檀,一...
    開(kāi)封第一講書(shū)人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音盒至,去河邊找鬼酗洒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枷遂,可吹牛的內(nèi)容都是我干的樱衷。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼登淘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼箫老!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起黔州,我...
    開(kāi)封第一講書(shū)人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耍鬓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后流妻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體牲蜀,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年绅这,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涣达。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡证薇,死狀恐怖度苔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浑度,我是刑警寧澤寇窑,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站箩张,受9級(jí)特大地震影響甩骏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜先慷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一饮笛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧论熙,春花似錦福青、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)二蓝。三九已至,卻和暖如春指厌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背踊跟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工踩验, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人商玫。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓箕憾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拳昌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袭异,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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