1. 程式人生 > 其它 >每日日報2021.3.11

每日日報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頁中的標題

每個網頁的頁面都有一個標題,比如這個頁面的標題即“百度一下,你就知道”,那麼如何知道當前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的開發