Android混合開發(fā)教程之WebView的使用方法總結(jié)
前言:
今天修改項(xiàng)目中一個(gè)有關(guān)WebView使用的bug,激起了我總結(jié)WebView的動(dòng)機(jī),今天抽空做個(gè)總結(jié)。
簡(jiǎn)介
WebView是一個(gè)基于webkit引擎、展現(xiàn)web頁面的控件。
Android的Webview在低版本和高版本采用了不同的webkit版本內(nèi)核,4.4后直接使用了Chrome。
作用
- 顯示和渲染W(wǎng)eb頁面
- 直接使用html文件(網(wǎng)絡(luò)上或本地assets中)作布局
- 可和JavaScript交互調(diào)用
WebView控件功能強(qiáng)大,除了具有一般View的屬性和設(shè)置外,還可以對(duì)url請(qǐng)求、頁面加載、渲染、頁面交互進(jìn)行強(qiáng)大的處理。
混合開發(fā)相關(guān)博客:
使用場(chǎng)景:
1.)添加權(quán)限
<uses-permission android:name="android.permission.INTERNET" />
2.)布局文件
<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" />
3.)數(shù)據(jù)加載
加載本地資源
webView.loadUrl(file:///android_asset/example.html);
加載網(wǎng)絡(luò)資源
webView.loadUrl(www.xxx.com/index.html);
添加請(qǐng)求頭信息
Map<String,String> map=new HashMap<String,String>(); map.put("User-Agent","Android"); webView.loadUrl("www.xxx.com/index.html",map);
也可以加載html片段
String data = " Html 數(shù)據(jù)"; webView.loadData(data, "text/html", "utf-8");
實(shí)測(cè)會(huì)發(fā)現(xiàn)loadData會(huì)導(dǎo)致中文亂碼,所以一般情況使用如下代碼
String data = " Html 數(shù)據(jù)"; webView.loadDataWithBaseURL(null,data, "text/html", "utf-8",null);
4.)支持JavaScript
比如項(xiàng)目總js觸發(fā)一個(gè)native函數(shù)關(guān)閉Activity
設(shè)置支持JavaScript
WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);//設(shè)置支持javascript webView.addJavascriptInterface(new JavaScriptInterface(), "xueleapp");
JavaScriptInterface 接口定義
public class JavaScriptInterface { @android.webkit.JavascriptInterface public void doTrainFinish() { finish(); } }
5.)設(shè)置WebViewClient 主要輔助WebView處理各種通知、請(qǐng)求事件
比如要實(shí)現(xiàn)WebView中鏈接在WebView內(nèi)部跳轉(zhuǎn)
webView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });
除此之外WebViewClient更多的處理網(wǎng)頁的地址的解析和渲染,例如
onLoadResource//加載資源時(shí)響應(yīng)
onPageStart//在加載頁面時(shí)響應(yīng)
onPageFinish//在加載頁面結(jié)束時(shí)響應(yīng)
onReceiveError//在加載出錯(cuò)時(shí)響應(yīng)
onReceivedHttpAuthRequest//獲取返回信息授權(quán)請(qǐng)求
6.)設(shè)置WebChromeClient主要輔助WebView處理Javascript的對(duì)話框,網(wǎng)站圖標(biāo),網(wǎng)站title,加載進(jìn)度等
比如加載進(jìn)度獲取title
webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 100) { //網(wǎng)頁加載完成 } else { //網(wǎng)頁加載中 } } });
除了上面檢測(cè)進(jìn)度之外還有
onCloseWindow//關(guān)閉WebView
onCreateWindow() //觸發(fā)創(chuàng)建一個(gè)新的窗口
onJsAlert //觸發(fā)彈出一個(gè)對(duì)話框
onJsPrompt //觸發(fā)彈出一個(gè)提示
onJsConfirm//觸發(fā)彈出確認(rèn)提示
onProgressChanged //加載進(jìn)度
onReceivedIcon //獲取網(wǎng)頁icon
onReceivedTitle//獲取網(wǎng)頁title
7.)設(shè)置網(wǎng)頁棧返回
webview會(huì)默認(rèn)把瀏覽過去的網(wǎng)頁進(jìn)行壓棧存儲(chǔ),所以我們有時(shí)需要實(shí)現(xiàn)回退到上一目錄
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (webView.canGoBack()) { webView.goBack();//返回上一瀏覽頁面 return true; } else { finish();//關(guān)閉Activity } } return super.onKeyDown(keyCode, event); }
8.)WebView 緩存控制
- LOAD_CACHE_ONLY: 不使用網(wǎng)絡(luò),只讀取本地緩存數(shù)據(jù)
- LOAD_DEFAULT: 根據(jù)cache-control決定是否從網(wǎng)絡(luò)上取數(shù)據(jù)。
- LOAD_CACHE_NORMAL: API level 17中已經(jīng)廢棄, 從API level 11開始作用同LOAD_DEFAULT模式
- LOAD_NO_CACHE: 不使用緩存,只從網(wǎng)絡(luò)獲取數(shù)據(jù).
- LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用緩存中的數(shù)據(jù)。
WebSettings webSettings = webView.getSettings(); webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
9.)WebView屏幕自適應(yīng)
WebSettings webSettings = webView.getSettings(); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true);
10.)其他不常用設(shè)置
WebSettings webSettings = webView.getSettings(); webSettings.setSupportZoom(true); //支持縮放 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持內(nèi)容重新布局 webSettings.supportMultipleWindows(); //多窗口 webSettings.setAllowFileAccess(true); //設(shè)置可以訪問文件 webSettings.setNeedInitialFocus(true); //當(dāng)webview調(diào)用requestFocus時(shí)為webview設(shè)置節(jié)點(diǎn) webSettings.setBuiltInZoomControls(true); //設(shè)置支持縮放 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口 webSettings.setLoadsImagesAutomatically(true); //支持自動(dòng)加載圖片
11.)知識(shí)擴(kuò)展WebViewJSBridge
雖然谷歌也提供了js與native函數(shù)互相調(diào)用的方式,但是通過addjavascriptInterface這種方式在Android 4.2以下版本存在一定的安全隱患,在Android 4.2以上也需要加@JavascriptInterface注解,否則無法調(diào)用?;谏厦娴脑蚪ㄗh學(xué)習(xí)一下
WebViewJSBridge這個(gè)比較不錯(cuò)的開源框架,地址:https://github.com/firewolf-ljw/WebViewJSBridge
12.)硬件加速
開啟硬件加速強(qiáng)制使用GPU渲染,確實(shí)給app流暢度帶來不小的提升,但是在使用過程中遇見webview閃爍,也有導(dǎo)致加載webView黑屏或者白屏
解決辦法:關(guān)閉硬件加速
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
這是把webview 中的硬件加速關(guān)閉。設(shè)置LAYER_TYPE_SOFTWARE后會(huì)把當(dāng)前view轉(zhuǎn)為bitmap保存。這樣就不能開多個(gè)webview,否則會(huì)報(bào)out of memory。
需要在在webview中加入如下代碼
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { invalidate(); super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
干我們這行,啥時(shí)候懈怠,就意味著長(zhǎng)進(jìn)的停止,長(zhǎng)進(jìn)的停止就意味著被淘汰,只能往前沖,直到鳳凰涅槃的一天!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
activity控制對(duì)話框風(fēng)格、顯示大小與位置
對(duì)于對(duì)話框風(fēng)格大家普遍使用PopupWindow,也有許多朋友開發(fā)設(shè)計(jì)時(shí)使用的是activity對(duì)話框方式,因此,本文對(duì)如何通過activity實(shí)現(xiàn)與PopupWindow相同的效果進(jìn)行詳細(xì)介紹,具有很好的參考價(jià)值,需要的朋友一起來看下吧2016-12-12Android gradle打包并自動(dòng)上傳的方法
本篇文章主要介紹了Android gradle打包并自動(dòng)上傳的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09Android編程實(shí)現(xiàn)長(zhǎng)按Button按鈕連續(xù)響應(yīng)功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)長(zhǎng)按Button按鈕連續(xù)響應(yīng)功能,涉及Android自定義按鈕及事件響應(yīng)操作相關(guān)技巧,需要的朋友可以參考下2017-01-01Android 清除SharedPreferences 產(chǎn)生的數(shù)據(jù)(實(shí)例代碼)
項(xiàng)目是要保存上次文件播放的位置,我使用SharedPreferences來保存,鍵值對(duì)分別是文件路徑和當(dāng)時(shí)播放的位置2013-11-11Android自定義View實(shí)現(xiàn)帶音效和震動(dòng)的SeekBar
這篇文章主要為大家詳細(xì)介紹了Android如何自定義View實(shí)一個(gè)帶音效和震動(dòng)的SeekBar,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03android中選中菜單的顯示跳轉(zhuǎn)和隱式跳轉(zhuǎn)的實(shí)例介紹
android中選中菜單的顯示跳轉(zhuǎn)和隱式跳轉(zhuǎn)的實(shí)例介紹,需要的朋友可以參考一下2013-05-05