android中webView 的基本使用與屬性總彙
阿新 • • 發佈:2019-02-09
為了使APP更加具有靈活性和可控制性,我們通常會在APP中內嵌運營人員可以自由切換的網頁。這時候我們就要用到一個神奇的控制元件webView。本篇文章由淺入深的詳細介紹webView 的使用與各項屬性,從最常用屬性到最不常用屬性依次進行了充分講解。(本文是由易到難,由常用屬性到不常用屬性對webView進行了全面講解,如非小白基礎內容可直接跳過)
一,我們先從最基本的功能入手,實現網頁的展示。
1,首先在佈局中新增webView控制元件,新增網路許可權。
控制元件:
<WebView
android:layout_width="match_parent"
android:layout_height ="match_parent"
android:id="@+id/webView"
/>
許可權:
<uses-permission android:name="android.permission.INTERNET"/>
2,為控制元件載入資源。
webView = (WebView) findViewById(R.id.webView);
//載入本地資源
//webView.loadUrl("file:///android_asset/house.html");
//載入網路資源
webView.loadUrl("http://daiba.com");
本地資源必須是.html格式。存放於assets資料夾內。
注意assets的層級關係。
3,重寫webView的返回邏輯,如果不重寫以下程式碼,網頁跳轉到多級頁面後按返回鍵不會返回到上一級頁面而會作用在APP的webView頁上。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
if (keyCode == KeyEvent.KEYCODE_BACK && webViewency.canGoBack()) {
webViewency.goBack();//返回上個頁面
} else {
finish();
}
}
return true;
}
二,webView常用功能。
1,監聽網頁的跳轉和資源的載入
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
if (url.contains("daiba")) {
//如果網址中有daiba字樣,程式將走這裡。可以做intent跳轉
Intent in = new Intent(A.this,B.class);
startActivity(in);
return true;
}else{
//如果沒有走這裡,繼續載入網頁。
view.loadUrl(url);
//返回值為true的時用WebView開啟,為false時呼叫系統瀏覽器或第三方瀏覽器開啟網路資源,如果沒有判斷語句可在最下方更改返回值。
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
});
2,檢視網頁的載入進度
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
if (newProgress == 100) {
// newProgress代表網頁載入進度,到達100完成載入
} else {
// 正在載入中
}
}
});
3,完善網頁快取機制
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
/*LOAD_CACHE_ELSE_NETWORK是預設的網路快取機制這裡不建議使用,建議使用LOAD_DEFAULT。
前者在H5頁面更新後容易出現頁面錯亂。
如果網頁的cache-control為no-cache,在模式LOAD_DEFAULT下,根據cache-control(網頁是否更新過)
決定是否從網路上取資料,如果更新過就重新獲取沒有更新過使用快取,斷網時會出現錯誤頁面;
在LOAD_CACHE_ELSE_NETWORK模式下,無論是否有網路,只要本地有快取,都使用快取。
本地沒有快取時才從網路上獲取。
如果網頁的的cache-control為max-age=60,在兩種模式下都使用本地快取資料
為了建立完善的快取機制,建議先判斷是否網路情況正常,正常情況使用使用LOAD_DEFAULT,
無網路時,使用LOAD_CACHE_ELSE_NETWORK。*/
快取模式(5種)
LOAD_CACHE_ONLY:不使用網路,只讀取本地快取資料
LOAD_DEFAULT:根據cache-control決定是否從網路上取資料。
LOAD_CACHE_NORMAL: API level 17中已經廢棄, 從API level 11開始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE:不使用快取,只從網路獲取資料.
LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用快取中的資料。
三,載入複雜網頁時對webView的簡單除錯
public class MainActivity extends BaseActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
init();
}
private void init(){
mWebView = (WebView) findViewById(R.id.webView);
//WebView載入web資源
mWebView.loadUrl("http://daiba.com");
/* 設定支援Js,必須設定的,基本大多數網頁都涉及js */
mWebView.getSettings().setJavaScriptEnabled(true);
/* 設定為true時表示支援使用js開啟新的視窗 */
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
/* 當網頁需要儲存數時據,設定下面屬性 */
mWebView.getSettings().setDomStorageEnabled(true);
/* 設定為使用webview推薦的視窗,主要是為了配合下一個屬性 */
mWebView.getSettings().setUseWideViewPort(true);
/* 設定網頁自適應螢幕大小,該屬性必須和上一屬性配合使用 */
mWebView.getSettings().setLoadWithOverviewMode(true);
/* 啟用還H5的地理定位服務 */
mWebView.getSettings().setGeolocationEnabled(true);
/* 設定是否允許webview使用縮放的功能 */
mWebView.getSettings().setBuiltInZoomControls(false);
/* 提高網頁渲染的優先順序 */
mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);
/* 設定是否顯示水平滾動條 */
mWebView.setHorizontalScrollBarEnabled(false);
/* 設定垂直滾動條是否有疊加樣式 */
mWebView.setVerticalScrollbarOverlay(true);
/* 設定滾動條的樣式 */
mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
}
}