每日日報2021.3.11
今天完成內容:
1.學習android
webview
3.2.1 WebSettings類
作用:對WebView進行配置和管理
配置步驟 & 常見方法:
配置步驟1:新增訪問網路許可權(AndroidManifest.xml)
- 1.這是前提!這是前提!這是前提!
- 2.<uses-permission android:name="android.permission.INTERNET"/>
配置步驟2:生成一個WebView元件(有兩種方式)
方式1:直接在在Activity中生成
WebView webView = new WebView(this)
方法2:在Activity的layout檔案裡新增webview控制元件:
WebView webview = (WebView) findViewById(R.id.webView1);
配置步驟3:進行配置-利用WebSettings子類(常見方法)
宣告WebSettings子類
WebSettings webSettings = webView.getSettings();
如果訪問的頁面中要與Javascript互動,
則webview必須設定支援Javascript
webSettings.setJavaScriptEnabled(true);
若載入的 html 裡有JS 在執行動畫等操作,會造成資源浪費(CPU、電量)
在 onStop 和 onResume 裡分別把 setJavaScriptEnabled() 給設定成 false 和 true 即可
支援外掛
webSettings.setPluginsEnabled(true);設定自適應螢幕,兩者合用
webSettings.setUseWideViewPort(true); //將圖片調整到適合webview的大小
webSettings.setLoadWithOverviewMode(true); // 縮放至螢幕的大小
縮放操作
webSettings.setSupportZoom(true); //支援縮放,預設為true。是下面那個的前提。
webSettings.setBuiltInZoomControls(true); //設定內建的縮放控制元件。若為false,則該WebView不可縮放
webSettings.setDisplayZoomControls(false); //隱藏原生的縮放控制元件
其他細節操作
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //關閉webview中快取
webSettings.setAllowFileAccess(true); //設定可以訪問檔案
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支援通過JS開啟新視窗
webSettings.setLoadsImagesAutomatically(true); //支援自動載入圖片
webSettings.setDefaultTextEncodingName(“utf-8”);//設定編碼格式
常見用法:設定WebView快取
* 當載入 html 頁面時,WebView會在/data/data/包名目錄下生成 database 與 cache 兩個資料夾
* 請求的 URL記錄儲存在 WebViewCache.db,而 URL的內容是儲存在 WebViewCache 資料夾下
* 是否啟用快取:
優先使用快取:
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
快取模式如下:
LOAD_CACHE_ONLY: 不使用網路,只讀取本地快取資料
LOAD_DEFAULT: (預設)根據cache-control決定是否從網路上取資料。
LOAD_NO_CACHE: 不使用快取,只從網路獲取資料.
LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用快取中的資料。
不使用快取:
WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
結合使用(離線載入)
if (NetStatusUtil.isConnected(getApplicationContext())) {
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//根據cache-control決定是否從網路上取資料。
} else {
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//沒網,則從本地獲取,即離線載入
}
webSettings.setDomStorageEnabled(true); // 開啟 DOM storage API 功能
webSettings.setDatabaseEnabled(true); //開啟 database storage API 功能
webSettings.setAppCacheEnabled(true);//開啟 Application Caches 功能
String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;
webSettings.setAppCachePath(cacheDirPath); //設定 Application Caches 快取目錄
注意: 每個 Application 只調用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize()
3.2.2 WebViewClient類
作用:處理各種通知 & 請求事件
常見方法:
常見方法1:shouldOverrideUrlLoading()
作用:開啟網頁時不呼叫系統瀏覽器, 而是在本WebView中顯示;在網頁上的所有載入都經過這個方法,這個函式我們可以做很多操作。
步驟1. 定義Webview元件
Webview webview = (WebView) findViewById(R.id.webView1);
步驟2. 選擇載入方式
方式1. 載入一個網頁:
webView.loadUrl(“http://www.google.com/”);
方式2:載入apk包中的html頁面
webView.loadUrl(“file:///android_asset/test.html”);
方式3:載入手機本地的html頁面
webView.loadUrl(“content://com.android.htmlfileprovider/sdcard/test.html”);
步驟3. 複寫shouldOverrideUrlLoading()方法,使得開啟網頁時不呼叫系統瀏覽器, 而是在本WebView中顯示
webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });
常見方法2:onPageStarted()
作用:開始載入頁面呼叫的,我們可以設定一個loading的頁面,告訴使用者程式在等待網路響應。
webView.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { //設定載入開始的操作 } });
常見方法3:onPageFinished()
作用:在頁面載入結束時呼叫。我們可以關閉loading 條,切換程式動作。
webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { //設定載入結束的操作 } });
常見方法4:onLoadResource()
作用:在載入頁面資源時會呼叫,每一個資源(比如圖片)的載入都會呼叫一次。
webView.setWebViewClient(new WebViewClient(){ @Override public boolean onLoadResource(WebView view, String url) { //設定載入資源的操作 } });
常見方法5:onReceivedError()
作用:載入頁面的伺服器出現錯誤時(如404)呼叫。
App裡面使用webview控制元件的時候遇到了諸如404這類的錯誤的時候,若也顯示瀏覽器裡面的那種錯誤提示頁面就顯得很醜陋了,那麼這個時候我們的app就需要載入一個本地的錯誤提示頁面,即webview如何載入一個本地的頁面
步驟1:寫一個html檔案(error_handle.html),用於出錯時展示給使用者看的提示頁面
步驟2:將該html檔案放置到程式碼根目錄的assets資料夾下
步驟3:複寫WebViewClient的onRecievedError方法
該方法傳回了錯誤碼,根據錯誤型別可以進行不同的錯誤分類處理
webView.setWebViewClient(new WebViewClient(){ @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){ switch(errorCode){ case HttpStatus.SC_NOT_FOUND: view.loadUrl("file:///android_assets/error_handle.html"); break; } } });
常見方法6:onReceivedSslError()
作用:處理https請求
webView預設是不處理https請求的,頁面顯示空白,需要進行如下設定:
webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); //表示等待證書響應 // handler.cancel(); //表示掛起連線,為預設方式 // handler.handleMessage(null); //可做其他處理 } });
3.2.3 WebChromeClient類
作用:輔助 WebView 處理 Javascript 的對話方塊,網站圖示,網站標題等等。
常見使用:
常見方法1: onProgressChanged()
作用:獲得網頁的載入進度並顯示
`webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress < 100) {
String progress = newProgress + "%";
progress.setText(progress);
} else {
}
});`
常見方法2: onReceivedTitle()
作用:獲取Web頁中的標題
每個網頁的頁面都有一個標題,比如http://www.baidu.com這個頁面的標題即“百度一下,你就知道”,那麼如何知道當前webview正在載入的頁面的title並進行設定呢?
`webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onReceivedTitle(WebView view, String title) {
titleview.setText(title);
}`
常見方法3: onJsAlert(
作用:支援javascript的警告框
一般情況下在 Android 中為 Toast,在文本里面加入\n就可以換行
webview.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(MainActivity.this) .setTitle("JsAlert") .setMessage(message) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }) .setCancelable(false) .show(); return true; }
常見方法4: onJsConfirm()
作用:支援javascript的確認框
`webview.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
new AlertDialog.Builder(MainActivity.this)
.setTitle("JsConfirm")
.setMessage(message)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
})
.setCancelable(false)
.show();
// 返回布林值:判斷點選時確認還是取消
// true表示點選了確認;false表示點選了取消;
return true;
}`
常見方法5: onJsPrompt()
作用:支援javascript輸入框
點選確認返回輸入框中的值,點選取消返回 null。
`webview.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
final EditText et = new EditText(MainActivity.this);
et.setText(defaultValue);
new AlertDialog.Builder(MainActivity.this)
.setTitle(message)
.setView(et)
.setPositiveButton(“OK”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm(et.getText().toString());
}
})
.setNegativeButton(“Cancel”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
})
.setCancelable(false)
.show();
return true;
1
}`
3.看視訊
遇到問題:
無
明日目標:
學習Android studio的開發