Android之WebView学习
WebView常用方法
WebSettings
在使用WebView前我們都要進(jìn)行相關(guān)的配置,常見的操作如下:
WebSettings settings = mWebView.getSettings();settings.setJavaScriptEnabled(true); //支持javascriptsettings.setUseWideViewPort(true); //設(shè)置webview推薦使用的窗口,使html界面自適應(yīng)屏幕settings.setLoadWithOverviewMode(true); //縮放至屏幕的大小settings.setAllowFileAccess(true); //設(shè)置可以訪問文件 // settings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); //設(shè)置中等像素密度,medium=160dpisettings.setSupportZoom(true); //設(shè)置支持縮放settings.setLoadsImagesAutomatically(true); //設(shè)置自動(dòng)加載圖片 // settings.setBlockNetworkImage(true); //設(shè)置網(wǎng)頁(yè)在加載的時(shí)候暫時(shí)不加載圖片 // settings.setAppCachePath(""); //設(shè)置緩存路徑settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //設(shè)置緩存模式WebChromeClient
WebChromeClient主要是輔助WebView處理Javascript的對(duì)話框,網(wǎng)站圖標(biāo),網(wǎng)站title,加載進(jìn)度等。
mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic void onReceivedTitle(WebView view, String title) {super.onReceivedTitle(view, title);mTitle.setText(title);}@Overridepublic void onProgressChanged(WebView view, int newProgress) {super.onProgressChanged(view, newProgress);if (newProgress == 100) {mProgressBar.setVisibility(View.GONE);}mProgressBar.setProgress(newProgress);}});WebViewClient
WebViewClient用來輔助WebView處理各種通知、請(qǐng)求事件的,例如在WebView中點(diǎn)擊請(qǐng)求新的鏈接、頁(yè)面加載開始、結(jié)束等:
mWebView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {return true;}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);}});上\下一個(gè)頁(yè)面
private void goBack(){if (mWebView.canGoBack()){mWebView.goBack();}else{finish();}}private void goForward() {if (mWebView.canGoForward()) {mWebView.goForward();}}就是通過WebView的goBack()、goForward()方法。
下載
mWebView.setDownloadListener(new DownloadListener() {@Overridepublic void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,long contentLength) {}});java與js交互
首先編寫一個(gè)簡(jiǎn)單的H5:
<!DOCTYPE html> <html> <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>js test</title> </head><script type="text/javascript">function click1(){window.client.showMessage("來自js的消息");}function click2(msg){alert("來自java代碼的消息:" + msg)}</script> <body><input id="one" type="button" value="js調(diào)用java代碼" onclick="click1()"style="width:300px; height:150px; font-size:35px"/> </body> </html>內(nèi)容很簡(jiǎn)單,兩個(gè)函數(shù)click1、click2,一個(gè)按鈕,點(diǎn)擊按鈕執(zhí)行click1函數(shù)。
將改H5文件放到assets目錄,之后用WebView加載改H5:
mWebView.loadUrl("file:///android_asset/test.html");接下來在Activity中編寫一個(gè)特殊的類:
class JsOperation {@JavascriptInterfacepublic void showMessage(String msg) {Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();}}然后注入到WebView中:
mWebView.addJavascriptInterface(new JsOperation(), "client");注意和js中的這行代碼對(duì)比下:
window.client.showMessage("來自js的消息");其中client就是addJavascriptInterface()的第二個(gè)參數(shù),當(dāng)然這個(gè)參數(shù)可以自定義,但要保持一致。js中調(diào)用的showMessage()方法,就是我們JsOperation類中的方法。
點(diǎn)擊H5中的按鈕,可以看到一個(gè)Toast提示:
到這里就完成了js對(duì)java代碼的調(diào)用,接下來看如下通過java代碼調(diào)用js。
其實(shí)很簡(jiǎn)單:
這樣就可以執(zhí)行js中的click2函數(shù)了。我們通過模擬器返回鍵執(zhí)行這行代碼,可以看到一個(gè)提示框,即click2函數(shù)得到執(zhí)行:
模擬原生應(yīng)用的頁(yè)面跳轉(zhuǎn)
效果
首先可以在Activity的onCreate()中創(chuàng)建一個(gè)棧,并將當(dāng)前Activity入棧:
if (mStack == null) {mStack = new Stack<>();}mStack.push(this);在WebView中繼續(xù)加載新頁(yè)面時(shí):
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {Intent intent = new Intent(MainActivity.this, MainActivity.class);intent.putExtra("url", url);startActivity(intent);return true;}我們重寫了shouldOverrideUrlLoading(),重新啟動(dòng)當(dāng)前Activity來加載新鏈接,則一個(gè)新的Activtiy會(huì)入棧,這樣就有了跳轉(zhuǎn)的效果。
在返回上一個(gè)界面時(shí)進(jìn)行出棧操作:
源碼
源碼
參考鏈接
Android 你應(yīng)該知道的WebView - 簡(jiǎn)書
總結(jié)
以上是生活随笔為你收集整理的Android之WebView学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【每日SQL打卡】
- 下一篇: MySQL索引原理、失效情况