Android中一個用于網頁顯示的控制元件,實際上,也可以看做一個功能最小化的瀏覽器,看起來類似于在微信中打開網頁鏈接的頁面,WebView主要用于在app應用中方便地訪問遠程網頁或本地html資源,同時,WebView也在Android中充當Java代碼和JS代碼之間互動的橋梁,
WebView基本用法
設定WebView至少有兩種方法
- 布局檔案中添加WebView控制元件 & Activity中設定加載頁面
- 呼叫setContentView()方法,直接通過代碼創建
一般采用第一種方法,在 Activity中設定加載頁面步驟如下
設定加載網址并使用loadUrl()方法加載
對變數private WebView wView;
-
電腦本地檔案:放在app/src/main/assets下的html
wView.loadUrl("file:///android_asset/test.html");手機本地檔案
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)
-
- 默認情況下,WebView會呼叫系統默認瀏覽器加載傳入的網址或者資源,如果需要在當前app頁面內加載,則需要設定WebViewClient 中的shouldOverrideUrlLoading()方法
在當前app頁面內加載
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.loadUrl("javascript:alert('hello')");
- wView.evaluateJavascript("javascript:alert('hello')",null);
放置位置如下:
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 用來管理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與WebChromeClient的區別
WebViewClient主要幫助WebView處理各種通知、請求事件的
WebChromeClient主要幫助WebView處理Javascript的對話框、網站圖示、網站title、加載進度等
實際使用的話,如果你的WebView只是用來處理一些html的頁面內容,只用WebViewClient就行了,如果需要更豐富的處理效果,比如JS、進度條等,就要用到WebChromeClient,根據實際使用的方法進行回呼
參考資料
- 這是一份全面 & 詳細的Webview使用攻略
https://www.jianshu.com/p/3c94ae673e2a/ - Android WebView 的使用(超詳細用法)
https://blog.csdn.net/weixin_40438421/article/details/85700109 - Android WebView全面講解
https://www.2cto.com/kf/201712/706339.html - 安卓使用WebView加載百度首頁
https://www.jianshu.com/p/b073102fb504 - Android webView 支持縮放及自適應螢屏
https://blog.csdn.net/qq_40885379/article/details/83058732 - android WebView(二)縮放
https://blog.csdn.net/w2865673691/article/details/44941495?utm_source=distribute.pc_relevant.none-task - 【天哥】Android開發視頻教程最新版 Android Studio開發
https://www.bilibili.com/video/av38409964 - WebViewClient與WebChromeClient
https://www.cnblogs.com/yaowen/p/5562971.html - WebView(網頁視圖)基本用法|菜鳥教程
https://www.runoob.com/w3cnote/android-tutorial-webview.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/31647.html
標籤:Android
上一篇:網易MuMu模擬器不顯示Menu(選單)鍵的解決辦法
下一篇:安卓接入融云IM連接不上??
