Android中一個用於網頁顯示的控件,實際上,也能夠看作一個功能最小化的瀏覽器,看起來相似於在微信中打開網頁連接的頁面。WebView主要用於在app應用中方便地訪問遠程網頁或本地html資源。同時,WebView也在Android中充當Java代碼和JS代碼之間交互的橋樑。javascript
設置WebView至少有兩種方法html
通常採用第一種方法,在 Activity中設置加載頁面步驟以下java
對變量private WebView wView;
android
電腦本地文件:放在app/src/main/assets下的htmlweb
wView.loadUrl("file:///android_asset/test.html");
chrome
手機本地文件瀏覽器
wView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
安全
遠程資源:微信
需先在清單文件 AndroidManifest文件中爲app申請網絡使用權限:網絡
<uses-permission android:name="android.permission.INTERNET"/>
填入網頁地址進行加載
wView.loadUrl("https://www.cnblogs.com/ifever/")
加載 HTML 頁面的一小段內容
WView.loadData(String data, String mimeType, String encoding)
wView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return false; }
以上兩個方法都會在WebView加載新的url時觸發。
Android 5.0如下系統會回調第一個方法,反之回調第二個方法。所以,爲了兼容不一樣的系統版本,能夠同時重寫這兩個方法。
能夠看到,這兩個方法都有一個boolean返回值。假如修改成true,會帶來重定向問題。
設置true的代碼以下
public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url);//手動加載 return true; } public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { view.loadUrl(request.getUrl().toString());//手動加載 return true; }
雖然不會影響加載,不過會帶來用戶點擊回退鍵始終沒法退出應用的問題,下面簡單介紹下原理:
假設訪問網頁過程爲A - > B - > C共三個站點,在C時點回退,C - > B沒問題,接着再點 B -> A,這個時候問題出現了。儘管B來到了A,可是由於重定向又跳轉到了B,如此循環往復...
返回值設爲false的狀況(且刪去view.loadUrl()方法)就可解決這種問題。其實不管返回true仍是false,只要爲WebView設置了WebViewClient,都不影響正常的加載功能,只是系統就不會再將url交給第三方的瀏覽器去處理了。
這兩種返回值的真正區別是這樣的:
shouldOverrideUrlLoading返回false,表明將url交給當前WebView加載,也就是正常的加載狀態;shouldOverrideUrlLoading返回true,表明開發者已經對url進行了處理,WebView就不會再對這個url進行加載了。能夠用於屏蔽某些網址,藉此實現黑名單機制。
解決了用戶點擊回退鍵始終沒法退出應用,但還存在一個顯著問題:用戶但願回退到上一級頁面,卻直接退出了app
goBack() //回退到上一級頁面
canGoBack()//可否回退到上一級頁面
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && wView.canGoBack()) { //若是按下返回鍵,同時又能夠回退到上一級頁面,就返回上一級 wView.goBack(); return true; } return super.onKeyDown(keyCode,event); }
默認狀況下,返回鍵會執行finish()方法,結束當前Activity。
有些app爲了防止用戶誤觸,在按下返回鍵且沒法回退上一級頁面時,會提示須要再次按下返回鍵,才結束當前Activity。這意味着須要在必定時間內連續按動兩次返回鍵纔可退出,設計更加人性化。將上述代碼改成
private long exitTime = 0; @Override public void onBackPressed() { if (wView.canGoBack()) { wView.goBack(); } else { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); } } }
此外修改佈局文件,經過添加按鈕並編寫,也能夠添加其餘新功能,經常使用的有
finish(); //關閉當前Activity,一鍵退出
wView.reload(); //刷新當前頁面
wView.setScrollY(0); //滾動到頂部
public void onProgressChanged(WebView view, int newProgress){
super.onProgressChanged(view,newProgress);
}
newProgress*100,便可得到當前加載的百分比,具體方法網上可查,這裏暫不深刻
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view,title);
setTitle(title);
}
在開通Java權限後,能夠設置網頁彈窗,至少有兩種方式,alert、confirm、prompt三種類型的彈窗
放置位置以下:
wView.setWebViewClient(new WebViewClient() { // @Override // public boolean shouldOverrideUrlLoading(WebView view, String url) { // return false; // } @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return false; } @Override public void onPageFinished(WebView view, String url) { //網頁加載完成時 super.onPageFinished(view, url); //wView.loadUrl("javascript:alert('hello')"); // wView.evaluateJavascript("javascript:alert('hello')",null); }});
開通Java權限及其餘設置見下文
WebSettings 用來管理WebView 狀態
爲了方便,這裏寫爲WebSettings settings = wView.getSettings();
默認狀況下,WebView是不支持Javascript的,須要調用 setJavaScriptEnabled(true),即
settings.setJavaScriptEnabled(true);
好比打開百度,添加該行代碼前,網頁少了不少廣告,進入搜索結果會提示須要切換爲完整版(由於沒法不支持JS因此沒法),但不涉及複雜功能的狀況下,不影響使用
添加後,反而容易報錯,也存在安全隱患,在本人的oppo r11上調試就會出現net_ERROR錯誤,暫時找不到緣由
即雙指縮放頁面的手勢控制縮放,由如下代碼實現
settings.setUseWideViewPort(true);//設定支持viewport屬性,有些頁面是很早期的只適配了pc的瀏覽器的頁面,頁面很大,須要寬大的視野來展現,這時候設置爲true就能夠在足夠的空間拖動,而且頁面能夠以任意比例縮放。 settings.setLoadWithOverviewMode(true); //自適應屏幕,用盡量大的視野展現頁面,通常和上一屬性搭配使用。固然大視野顯示的字都很小。 settings.setBuiltInZoomControls(true); // 使用縮放控件 settings.setDisplayZoomControls(false); // 隱藏縮放控件 settings.setSupportZoom(true);//設定支持縮放,只設置此屬性並不能實現縮放,在某些版本的手機上也只是能實現點擊縮放。
在不少網頁依舊不能縮放,經查閱,應該是頁面已經被設置好手機樣式了,但對於傳統的PC版網頁,縮放功能仍有效。
WebView在實際使用中須要用到的兩個類,這裏記錄一下兩者的區別
WebViewClient主要幫助WebView處理各類通知、請求事件的
WebChromeClient主要幫助WebView處理Javascript的對話框、網站圖標、網站title、加載進度等
實際使用的話,若是你的WebView只是用來處理一些html的頁面內容,只用WebViewClient就好了,若是須要更豐富的處理效果,好比JS、進度條等,就要用到WebChromeClient,根據實際使用的方法進行回調