webview

為了方便開發(fā)者實(shí)現(xiàn)在app內(nèi)展示網(wǎng)頁并與網(wǎng)頁交互的需求,Android SDK提供了WebView組件。 它繼承自AbsoluteLayout,展示網(wǎng)頁的同時(shí),也可以在其中放入其他的子View。現(xiàn)如今,Hybrid應(yīng)用似乎占據(jù)的APP的主流類型,那么關(guān)于WebView的使用就變得越發(fā)的重要。從Android 4.4(KitKat)開始,原本基于WebKit的WebView開始基于Chromium內(nèi)核,這一改動大大提升了WebView組件的性能以及對HTML5,CSS3,JavaScript的支持。不過它的API卻沒有很大的改動,在兼容低版本的同時(shí)只引進(jìn)了少部分新的API,并不需要你做很大的改動。鏈接 https://developer.android.com/guide/webapps/migrating.html
在WebView中,有幾個(gè)地方是我們可以使用來定制我們的WebView各種行為的,分別是:WebSettings、JavaScriptInterface、WebViewClient以及WebChromeClient。

WebView常用方法
  • String getUrl():獲取當(dāng)前頁面的URL。
  • reload():重新reload當(dāng)前的URL,即刷新。
  • boolean canGoBack():用來確認(rèn)WebView里是否還有可回退的歷史記錄。通常我們會在WebView里重寫返回鍵的點(diǎn)擊事件,通過該方法判斷WebView里是否還有歷史記錄,若有則返回上一頁。
  • boolean canGoForward():用來確認(rèn)WebView是否還有可向前的歷史記錄。
  • boolean canGoBackOrForward(int steps):以當(dāng)前的頁面為起始點(diǎn),用來確認(rèn)WebView的歷史記錄是否足以后退或前進(jìn)給定的步數(shù),正數(shù)為前進(jìn),負(fù)數(shù)為后退。
  • goBack():在WebView歷史記錄后退到上一項(xiàng)。
  • goForward():在WebView歷史記錄里前進(jìn)到下一項(xiàng)。
  • getScrollY():該方法返回的當(dāng)前可見區(qū)域的頂端距整個(gè)頁面頂端的距離,也就是當(dāng)前內(nèi)容滾動的距離。
  • getHeight():方法都返回當(dāng)前WebView這個(gè)容器的高度。其實(shí)以上兩個(gè)方法都屬于View。
  • getContentHeight():該方法返回整個(gè)HTML頁面的高度,但該高度值并不等同于當(dāng)前整個(gè)頁面的高度,因?yàn)閃ebView有縮放功能, 所以當(dāng)前整個(gè)頁面的高度實(shí)際上應(yīng)該是原始HTML的高度再乘上縮放比例。因此,準(zhǔn)確的判斷方法應(yīng)該是
if (webView.getContentHeight() * webView.getScale() == (webView.getHeight() + webView.getScrollY())) {
    //已經(jīng)處于底端
}
if(webView.getScrollY() == 0){
    //處于頂端
}
  • pageUp(boolean top):將WebView展示的頁面滑動至頂部。
  • pageDown(boolean bottom):將WebView展示的頁面滑動至底部。
WebSettings

WebSettings是用來管理WebView配置的類。當(dāng)WebView第一次創(chuàng)建時(shí),內(nèi)部會包含一個(gè)默認(rèn)配置的集合。若我們想更改這些配置,便可以通過WebSettings里的方法來進(jìn)行設(shè)置。
WebSettings對象可以通過WebView.getSettings()獲得,它的生命周期是與它的WebView本身息息相關(guān)的,如果WebView被銷毀了,那么任何由WebSettings調(diào)用的方法也同樣不能使用。
獲取WebSettings對象
WebSettings webSettings = webView.getSettings();
WebSettings常用方法
(幾乎所有的set方法都有相應(yīng)的get方法,這里就只介紹set了。

另,所有未寫方法返回值類型的皆為空類型)
  • setJavaScriptEnabled(boolean flag):設(shè)置WebView是否可以運(yùn)行JavaScript。
  • setJavaScriptCanOpenWindowsAutomatically(boolean flag):設(shè)置WebView是否可以由JavaScript自動打開窗口,默認(rèn)為false,通常與JavaScript的window.open()配合使用。
  • setAllowFileAccess(boolean allow):啟用或禁用WebView訪問文件數(shù)據(jù)。
  • setBlockNetworkImage(boolean flag):禁止或允許WebView從網(wǎng)絡(luò)上加載圖片。需要注意的是,如果設(shè)置是從禁止到允許的轉(zhuǎn)變的話,圖片數(shù)據(jù)并不會在設(shè)置改變后立刻去獲取,而是在WebView調(diào)用reload()的時(shí)候才會生效。
    這個(gè)時(shí)候,需要確保這個(gè)app擁有訪問Internet的權(quán)限,否則會拋出安全異常。
    通常沒有禁止圖片加載的需求的時(shí)候,完全不用管這個(gè)方法,因?yàn)楫?dāng)我們的app擁有訪問Internet的權(quán)限時(shí),這個(gè)flag的默認(rèn)值就是false。
  • setSupportZoom(boolean support):設(shè)置是否支持縮放。
  • setBuiltInZoomControls(boolean enabled):顯示或不顯示縮放按鈕(wap網(wǎng)頁不支持)。
  • setSupportMultipleWindows(boolean support):設(shè)置WebView是否支持多窗口。
  • setLayoutAlgorithm(WebSettings.LayoutAlgorithm l):指定WebView的頁面布局顯示形式,調(diào)用該方法會引起頁面重繪。默認(rèn)值為LayoutAlgorithm#NARROW_COLUMNS。
  • setNeedInitialFocus(boolean flag):通知WebView是否需要設(shè)置一個(gè)節(jié)點(diǎn)獲取焦點(diǎn)當(dāng)WebView#requestFocus(int,android.graphics.Rect)被調(diào)用時(shí),默認(rèn)為true。
  • setAppCacheEnabled(boolean flag):啟用或禁用應(yīng)用緩存。
  • setAppCachePath(String appCachePath):設(shè)置應(yīng)用緩存路徑,這個(gè)路徑必須是可以讓app寫入文件的。該方法應(yīng)該只被調(diào)用一次,重復(fù)調(diào)用會被無視~
  • setCacheMode(int mode):用來設(shè)置WebView的緩存模式。當(dāng)我們加載頁面或從上一個(gè)頁面返回的時(shí)候,會按照設(shè)置的緩存模式去檢查并使用(或不使用)緩存。
    緩存模式有四種:
1. LOAD_DEFAULT:默認(rèn)的緩存使用模式。在進(jìn)行頁面前進(jìn)或后退的操作時(shí),如果緩存可用并未過期就優(yōu)先加載緩存,否則從網(wǎng)絡(luò)上加載數(shù)據(jù)。這樣可以減少頁面的網(wǎng)絡(luò)請求次數(shù)。
2. LOAD_CACHE_ELSE_NETWORK:只要緩存可用就加載緩存,哪怕它們已經(jīng)過期失效。如果緩存不可用就從網(wǎng)絡(luò)上加載數(shù)據(jù)。
3. LOAD_NO_CACHE:不加載緩存,只從網(wǎng)絡(luò)加載數(shù)據(jù)。
4. LOAD_CACHE_ONLY:不從網(wǎng)絡(luò)加載數(shù)據(jù),只從緩存加載數(shù)據(jù)。
通常我們可以根據(jù)網(wǎng)絡(luò)情況將這幾種模式結(jié)合使用,比如有網(wǎng)的時(shí)候使用LOAD_DEFAULT,離線時(shí)使用
5. LOAD_CACHE_ONLY、LOAD_CACHE_ELSE_NETWORK,讓用戶不至于在離線時(shí)啥都看不到。
  • setDatabaseEnabled(boolean flag):啟用或禁用數(shù)據(jù)庫緩存。
  • setDomStorageEnabled(boolean flag):啟用或禁用DOM緩存。
  • setUserAgentString(String ua):設(shè)置WebView的UserAgent值。
  • setDefaultEncodingName(String encoding):設(shè)置編碼格式,通常都設(shè)為“UTF-8”。
  • setStandardFontFamily(String font):設(shè)置標(biāo)準(zhǔn)的字體族,默認(rèn)“sans-serif”。
  • setCursiveFontFamily:設(shè)置草書字體族,默認(rèn)“cursive”。
  • setFantasyFontFamily:設(shè)置CursiveFont字體族,默認(rèn)“cursive”。
  • setFixedFontFamily:設(shè)置混合字體族,默認(rèn)“monospace”。
  • setSansSerifFontFamily:設(shè)置梵文字體族,默認(rèn)“sans-serif”。
  • setSerifFontFamily:設(shè)置襯線字體族,默認(rèn)“sans-serif”
  • setDefaultFixedFontSize(int size):設(shè)置默認(rèn)填充字體大小,默認(rèn)16,取值區(qū)間為[1-72],超過范圍,使用其上限值。
  • setDefaultFontSize(int size):設(shè)置默認(rèn)字體大小,默認(rèn)16,取值區(qū)間[1-72],超過范圍,使用其上限值。
  • setMinimumFontSize:設(shè)置最小字體,默認(rèn)8. 取值區(qū)間[1-72],超過范圍,使用其上限值。
  • setMinimumLogicalFontSize:設(shè)置最小邏輯字體,默認(rèn)8. 取值區(qū)間[1-72],超過范圍,使用其上限值。
    以上就是一些WebSettings的常用方法,具體的使用以及一些緩存的問題會在接下來的代碼以及文章中有更加直觀的說明
WebViewClient

從名字上不難理解,這個(gè)類就像WebView的委托人一樣,是幫助WebView處理各種通知和請求事件的,我們可以稱他為WebView的“內(nèi)政大臣”。

  • onLoadResource(WebView view, String url):該方法在加載頁面資源時(shí)會回調(diào),每一個(gè)資源(比如圖片)的加載都會調(diào)用一次。
  • onPageStarted(WebView view, String url, Bitmap favicon):該方法在WebView開始加載頁面且僅在Main frame loading(即整頁加載)時(shí)回調(diào),一次Main frame的加載只會回調(diào)該方法一次。我們可以在這個(gè)方法里設(shè)定開啟一個(gè)加載的動畫,告訴用戶程序在等待網(wǎng)絡(luò)的響應(yīng)。
  • onPageFinished(WebView view, String url):該方法只在WebView完成一個(gè)頁面加載時(shí)調(diào)用一次(同樣也只在Main frame loading時(shí)調(diào)用),我們可以可以在此時(shí)關(guān)閉加載動畫,進(jìn)行其他操作。
  • onReceivedError(WebView view, WebResourceRequest request, WebResourceError error):該方法在web頁面加載錯(cuò)誤時(shí)回調(diào),這些錯(cuò)誤通常都是由無法與服務(wù)器正常連接引起的,最常見的就是網(wǎng)絡(luò)問題。 這個(gè)方法有兩個(gè)地方需要注意:
    1.這個(gè)方法只在與服務(wù)器無法正常連接時(shí)調(diào)用,類似于服務(wù)器返回錯(cuò)誤碼的那種錯(cuò)誤(即HTTP ERROR),該方法是不會回調(diào)的,因?yàn)槟阋呀?jīng)和服務(wù)器正常連接上了(全怪官方文檔(︶^︶));
    2.這個(gè)方法是新版本的onReceivedError()方法,從API23開始引進(jìn),與舊方法onReceivedError(WebView view,int errorCode,String description,String failingUrl)不同的是,新方法在頁面局部加載發(fā)生錯(cuò)誤時(shí)也會被調(diào)用(比如頁面里兩個(gè)子Tab或者一張圖片)。這就意味著該方法的調(diào)用頻率可能會更加頻繁,所以我們應(yīng)該在該方法里執(zhí)行盡量少的操作。
  • onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse):上一個(gè)方法提到onReceivedError并不會在服務(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í),該方法便會回調(diào)。這個(gè)方法的作用域并不局限于Main Frame,任何資源的加載引發(fā)HTTP ERROR都會引起該方法的回調(diào),所以我們也應(yīng)該在該方法里執(zhí)行盡量少的操作,只進(jìn)行非常必要的錯(cuò)誤處理等。
  • onReceivedSslError(WebView view, SslErrorHandler handler, SslError error):當(dāng)WebView加載某個(gè)資源引發(fā)SSL錯(cuò)誤時(shí)會回調(diào)該方法,這時(shí)WebView要么執(zhí)行handler.cancel()取消加載,要么執(zhí)行handler.proceed()方法繼續(xù)加載(默認(rèn)為cancel)。需要注意的是,這個(gè)決定可能會被保留并在將來再次遇到SSL錯(cuò)誤時(shí)執(zhí)行同樣的操作。
  • WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request):當(dāng)WebView需要請求某個(gè)數(shù)據(jù)時(shí),這個(gè)方法可以攔截該請求來告知app并且允許app本身返回一個(gè)數(shù)據(jù)來替代我們原本要加載的數(shù)據(jù)。

比如你對web的某個(gè)js做了本地緩存,希望在加載該js時(shí)不再去請求服務(wù)器而是可以直接讀取本地緩存的js,這個(gè)方法就可以幫助你完成這個(gè)需求。你可以寫一些邏輯檢測這個(gè)request,并返回相應(yīng)的數(shù)據(jù),你返回的數(shù)據(jù)就會被WebView使用,如果你返回null,WebView會繼續(xù)向服務(wù)器請求。

  • boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request):哈~ 終于到了這個(gè)方法,在最開始的基礎(chǔ)演示時(shí)我們用到了這個(gè)方法。從實(shí)踐中我們知道,當(dāng)我們沒有給WebView提供WebViewClient時(shí),WebView如果要加載一個(gè)url會向ActivityManager尋求一個(gè)適合的處理者來加載該url(比如系統(tǒng)自帶的瀏覽器),這通常是我們不想看到的。于是我們需要給WebView提供一個(gè)WebViewClient,并重寫該方法返回true來告知WebView url的加載就在app中進(jìn)行。這時(shí)便可以實(shí)現(xiàn)在app內(nèi)訪問網(wǎng)頁。
  • onScaleChanged(WebView view, float oldScale, float newScale):當(dāng)WebView得頁面Scale值發(fā)生改變時(shí)回調(diào)。
  • boolean shouldOverrideKeyEvent(WebView view, KeyEvent event):默認(rèn)值為false,重寫此方法并return true可以讓我們在WebView內(nèi)處理按鍵事件。
WebChromeClient

如果說 WebViewClient 是幫助 WebView 處理各種通知、請求事件的“內(nèi)政大臣”的話,那么WebChromeClient就是輔助WebView處理Javascript的對話框,網(wǎng)站圖標(biāo),網(wǎng)站title,加載進(jìn)度等偏外部事件的“外交大臣”。

  • onProgressChanged(WebView view, int newProgress):當(dāng)頁面加載的進(jìn)度發(fā)生改變時(shí)回調(diào),用來告知主程序當(dāng)前頁面的加載進(jìn)度。
  • onReceivedIcon(WebView view, Bitmap icon):用來接收web頁面的icon,我們可以在這里將該頁面的icon設(shè)置到Toolbar。
  • onReceivedTitle(WebView view, String title):用來接收web頁面的title,我們可以在這里將頁面的title設(shè)置到Toolbar。
    以下兩個(gè)方法是為了支持web頁面進(jìn)入全屏模式而存在的(比如播放視頻),如果不實(shí)現(xiàn)這兩個(gè)方法,該web上的內(nèi)容便不能進(jìn)入全屏模式。
  • onShowCustomView(View view, WebChromeClient.CustomViewCallback callback):該方法在當(dāng)前頁面進(jìn)入全屏模式時(shí)回調(diào),主程序必須提供一個(gè)包含當(dāng)前web內(nèi)容(視頻 or Something)的自定義的View。
  • onHideCustomView():該方法在當(dāng)前頁面退出全屏模式時(shí)回調(diào),主程序應(yīng)在這時(shí)隱藏之前show出來的View。
  • Bitmap getDefaultVideoPoster():當(dāng)我們的Web頁面包含視頻時(shí),我們可以在HTML里為它設(shè)置一個(gè)預(yù)覽圖,WebView會在繪制頁面時(shí)根據(jù)它的寬高為它布局。而當(dāng)我們處于弱網(wǎng)狀態(tài)下時(shí),我們沒有比較快的獲取該圖片,那WebView繪制頁面時(shí)的gitWidth()方法就會報(bào)出空指針異常~ 于是app就crash了。。
    這時(shí)我們就需要重寫該方法,在我們尚未獲取web頁面上的video預(yù)覽圖時(shí),給予它一個(gè)本地的圖片,避免空指針的發(fā)生。
  • View getVideoLoadingProgressView():重寫該方法可以在視頻loading時(shí)給予一個(gè)自定義的View,可以是加載圓環(huán) or something。
  • boolean onJsAlert(WebView view, String url, String message, JsResult result):處理Javascript中的Alert對話框。
  • boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result):處理Javascript中的Prompt對話框。
  • boolean onJsConfirm(WebView view, String url, String message, JsResult result):處理Javascript中的Confirm對話框
  • boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams):該方法在用戶進(jìn)行了web上某個(gè)需要上傳文件的操作時(shí)回調(diào)。我們應(yīng)該在這里打開一個(gè)文件選擇器,如果要取消這個(gè)請求我們可以調(diào)用filePathCallback.onReceiveValue(null)并返回true。
  • onPermissionRequest(PermissionRequest request):該方法在web頁面請求某個(gè)尚未被允許或拒絕的權(quán)限時(shí)回調(diào),主程序在此時(shí)調(diào)用grant(String [])或deny()方法。如果該方法沒有被重寫,則默認(rèn)拒絕web頁面請求的權(quán)限。
  • onPermissionRequestCanceled(PermissionRequest request):該方法在web權(quán)限申請權(quán)限被取消時(shí)回調(diào),這時(shí)應(yīng)該隱藏任何與之相關(guān)的UI界面。
1、設(shè)置WebView支持js
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface(), "JHAPP");
2、Android調(diào)用JS(有2種方法)
  1. 通過WebView的loadUrl()
    必須另開線程進(jìn)行JS方法調(diào)用(否則無法調(diào)用)
final String parameter = "{" +
                            "\"lng\":\"" + shoplng + "\"," +
                            "\"lat\":\"" + shoplat + "\"," +
                            "\"addr\":\"" + shopAddr +
                            "\"}";
webView.post(new Runnable() {
       @Override
       public void run() {
         webView.loadUrl("javascript:setLocation('" + parameter + "')");
       }
  });

無參無返回值函數(shù)

String call = "javascript:readyToGo()";webView.loadUrl(call);

有參無返回值函數(shù)

String call = "javascript:alertMessage(\"" + "content" + "\")";webView.loadUrl(call);
  1. 通過WebView的evaluateJavascript()
    優(yōu)點(diǎn):該方法比第一種方法效率更高、使用更簡潔。
    因?yàn)樵摲椒ǖ膱?zhí)行不會使頁面刷新,而第一種方法(loadUrl )的執(zhí)行則會。
    Android 4.4 后才可使用
    有參數(shù)有返回值的函數(shù)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    //第一個(gè)參數(shù)為js中的方法名,該段代碼每執(zhí)行一次則調(diào)用js方法一次
     webView.evaluateJavascript("setLocation('" + parameter + "')", new ValueCallback<String>() {
         @Override
            public void onReceiveValue(String value) {
                //此處為 js 返回的結(jié)果  有返回值時(shí)我們可以調(diào)用mWebView.evaluateJavascript()方法

              }
       });
 }
特別注意:JS代碼調(diào)用一定要在 onPageFinished() 回調(diào)之后才能調(diào)用,否則不會調(diào)用。
3、JS去調(diào)用Android
private class JavaScriptInterface {

        //被JS調(diào)用的方法必須加入@JavascriptInterface注解
        @JavascriptInterface
        public void getLocation() {
            Message msg = new Message();
            msg.what = GET_LOCATION;
            mHandler.sendMessage(msg);
        }
    }

private void initWebSettings() {
      WebSettings settings = mWebView.getSettings();
      //支持獲取手勢焦點(diǎn)
      mWebView.requestFocusFromTouch();
      //支持JS
      settings.setJavaScriptEnabled(true);
      //支持插件
      settings.setPluginState(WebSettings.PluginState.ON);
      //設(shè)置適應(yīng)屏幕
      settings.setUseWideViewPort(true);
      settings.setLoadWithOverviewMode(true);
      //支持縮放
      settings.setSupportZoom(false);
      //隱藏原生的縮放控件
      settings.setDisplayZoomControls(false);
      //支持內(nèi)容重新布局
      settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
      settings.supportMultipleWindows();
      settings.setSupportMultipleWindows(true);
      //設(shè)置緩存模式
      settings.setDomStorageEnabled(true);
      settings.setDatabaseEnabled(true);
      settings.setCacheMode(WebSettings.LOAD_DEFAULT);
      settings.setAppCacheEnabled(true);
      settings.setAppCachePath(mWebView.getContext().getCacheDir().getAbsolutePath());

      //設(shè)置可訪問文件
      settings.setAllowFileAccess(true);
      //當(dāng)webview調(diào)用requestFocus時(shí)為webview設(shè)置節(jié)點(diǎn)
      settings.setNeedInitialFocus(true);
      //支持自動加載圖片
      if (Build.VERSION.SDK_INT >= 19) {
          settings.setLoadsImagesAutomatically(true);
      } else {
          settings.setLoadsImagesAutomatically(false);
      }
      settings.setNeedInitialFocus(true);
      //設(shè)置編碼格式
      settings.setDefaultTextEncodingName("UTF-8");
  }

  private void initWebViewClient() {
      mWebView.setWebViewClient(new WebViewClient() {

          //頁面開始加載時(shí)
          @Override
          public void onPageStarted(WebView view, String url, Bitmap favicon) {
              super.onPageStarted(view, url, favicon);
              mProgressbar.setVisibility(View.VISIBLE);
          }


          //頁面完成加載時(shí)
          @Override
          public void onPageFinished(WebView view, String url) {
              super.onPageFinished(view, url);
              mProgressbar.setVisibility(View.GONE);
          }

          //是否在WebView內(nèi)加載新頁面
          @Override
          public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
              view.loadUrl(request.toString());
              return true;
          }

          //網(wǎng)絡(luò)錯(cuò)誤時(shí)回調(diào)的方法
          @Override
          public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
              super.onReceivedError(view, request, error);
              /**
               * 在這里寫網(wǎng)絡(luò)錯(cuò)誤時(shí)的邏輯,比如顯示一個(gè)錯(cuò)誤頁面
               *
               * 這里我偷個(gè)懶不寫了
               * */
          }

          @TargetApi(Build.VERSION_CODES.M)
          @Override
          public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
              super.onReceivedHttpError(view, request, errorResponse);
          }
      });
  }

  private void initWebChromeClient() {

      mWebView.setWebChromeClient(new WebChromeClient() {

          private Bitmap mDefaultVideoPoster;//默認(rèn)的視頻展示圖

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

          @Override
          public Bitmap getDefaultVideoPoster() {
              if (mDefaultVideoPoster == null) {
                  mDefaultVideoPoster = BitmapFactory.decodeResource(
                          getResources(), R.drawable.video_default
                  );
                  return mDefaultVideoPoster;
              }
              return super.getDefaultVideoPoster();
          }
      });
  }

  /**
   * 設(shè)置Toolbar標(biāo)題
   *
   * @param title
   */
  private void setToolbarTitle(final String title) {
      Log.d("setToolbarTitle", " WebDetailActivity " + title);
      if (mToolbar != null) {
          mToolbar.post(new Runnable() {
              @Override
              public void run() {
                  mToolbar.setTitle(TextUtils.isEmpty(title) ? getString(R.string.loading) : title);
              }
          });
      }
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.menu_main, menu);
      return super.onCreateOptionsMenu(menu);
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
      switch (item.getItemId()) {
          case R.id.page_up:
              Toast.makeText(getApplicationContext(), "頁面向上", Toast.LENGTH_SHORT).show();
              mWebView.pageUp(true);
              break;
          case R.id.page_down:
              Toast.makeText(getApplicationContext(), "頁面向下", Toast.LENGTH_SHORT).show();
              mWebView.pageDown(true);
              break;
          case R.id.refresh:
              Toast.makeText(getApplicationContext(), "刷新~", Toast.LENGTH_SHORT).show();
              mWebView.reload();
          default:
              return super.onOptionsItemSelected(item);
      }
      return super.onOptionsItemSelected(item);
  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {

      //如果按下的是回退鍵且歷史記錄里確實(shí)還有頁面
      if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
          mWebView.goBack();
          return true;
      } else {
          Toast.makeText(getApplicationContext(), "考試結(jié)束,恭喜您考試合格!", Toast.LENGTH_LONG).show();
      }
      return super.onKeyDown(keyCode, event);
  }}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • WebView·開車指南 目錄 WebView簡介 WebView基本使用 WebView常用方法 WebSett...
    南城的人閱讀 4,774評論 0 19
  • WebView·開車指南 目錄 WebView簡介 WebView基本使用 WebView常用方法 WebSett...
    小莊bb閱讀 3,536評論 3 25
  • Tips 由于WebView的用法實(shí)在太多,如果您只是想查詢某個(gè)功能的使用——建議Ctrl+F(Commad+F)...
    BugDev閱讀 7,766評論 11 109
  • WebView常用方法 String getUrl():獲取當(dāng)前頁面的URL。 reload():重新reload...
    JuSong閱讀 3,335評論 0 3
  • WebView簡介 String getUrl():獲取當(dāng)前頁面的URL。 reload():重新reload當(dāng)前...
    QM閱讀 3,161評論 0 52