Android之WebView学习
WebView常用方法
WebSettings
在使用WebView前我們都要進行相關的配置,常見的操作如下:
WebSettings settings = mWebView.getSettings();settings.setJavaScriptEnabled(true); //支持javascriptsettings.setUseWideViewPort(true); //設置webview推薦使用的窗口,使html界面自適應屏幕settings.setLoadWithOverviewMode(true); //縮放至屏幕的大小settings.setAllowFileAccess(true); //設置可以訪問文件 // settings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); //設置中等像素密度,medium=160dpisettings.setSupportZoom(true); //設置支持縮放settings.setLoadsImagesAutomatically(true); //設置自動加載圖片 // settings.setBlockNetworkImage(true); //設置網頁在加載的時候暫時不加載圖片 // settings.setAppCachePath(""); //設置緩存路徑settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //設置緩存模式WebChromeClient
WebChromeClient主要是輔助WebView處理Javascript的對話框,網站圖標,網站title,加載進度等。
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處理各種通知、請求事件的,例如在WebView中點擊請求新的鏈接、頁面加載開始、結束等:
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);}});上\下一個頁面
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交互
首先編寫一個簡單的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調用java代碼" onclick="click1()"style="width:300px; height:150px; font-size:35px"/> </body> </html>內容很簡單,兩個函數click1、click2,一個按鈕,點擊按鈕執行click1函數。
將改H5文件放到assets目錄,之后用WebView加載改H5:
mWebView.loadUrl("file:///android_asset/test.html");接下來在Activity中編寫一個特殊的類:
class JsOperation {@JavascriptInterfacepublic void showMessage(String msg) {Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();}}然后注入到WebView中:
mWebView.addJavascriptInterface(new JsOperation(), "client");注意和js中的這行代碼對比下:
window.client.showMessage("來自js的消息");其中client就是addJavascriptInterface()的第二個參數,當然這個參數可以自定義,但要保持一致。js中調用的showMessage()方法,就是我們JsOperation類中的方法。
點擊H5中的按鈕,可以看到一個Toast提示:
到這里就完成了js對java代碼的調用,接下來看如下通過java代碼調用js。
其實很簡單:
這樣就可以執行js中的click2函數了。我們通過模擬器返回鍵執行這行代碼,可以看到一個提示框,即click2函數得到執行:
模擬原生應用的頁面跳轉
效果
首先可以在Activity的onCreate()中創建一個棧,并將當前Activity入棧:
if (mStack == null) {mStack = new Stack<>();}mStack.push(this);在WebView中繼續加載新頁面時:
@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(),重新啟動當前Activity來加載新鏈接,則一個新的Activtiy會入棧,這樣就有了跳轉的效果。
在返回上一個界面時進行出棧操作:
源碼
源碼
參考鏈接
Android 你應該知道的WebView - 簡書
總結
以上是生活随笔為你收集整理的Android之WebView学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【每日SQL打卡】
- 下一篇: Android主题换肤实现