一忌警、WebView常用方法
1、WebSettings
在使用WebView前我們都要進(jìn)行相關(guān)的配置杆逗,常見的操作如下:
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true); //支持javascript
settings.setUseWideViewPort(true); //設(shè)置webview推薦使用的窗口磅摹,使html界面自適應(yīng)屏幕
settings.setLoadWithOverviewMode(true); //縮放至屏幕的大小
settings.setAllowFileAccess(true); //設(shè)置可以訪問文件
// settings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); //設(shè)置中等像素密度,medium=160dpi
settings.setSupportZoom(true); //設(shè)置支持縮放
settings.setLoadsImagesAutomatically(true); //設(shè)置自動(dòng)加載圖片
// settings.setBlockNetworkImage(true); //設(shè)置網(wǎng)頁在加載的時(shí)候暫時(shí)不加載圖片
// settings.setAppCachePath(""); //設(shè)置緩存路徑
settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //設(shè)置緩存模式
可以看到都是通過WebSettings來設(shè)置的闸准,還有很多沒有列舉益愈。。恕汇。根據(jù)需求選擇就好了
2腕唧、WebChromeClient
WebChromeClient主要是輔助WebView處理Javascript的對(duì)話框或辖,網(wǎng)站圖標(biāo)瘾英,網(wǎng)站title,加載進(jìn)度等颂暇。
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
mTitle.setText(title);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress == 100) {
mProgressBar.setVisibility(View.GONE);
}
mProgressBar.setProgress(newProgress);
}
});
在示例代碼中我們得到了網(wǎng)頁的標(biāo)題缺谴、進(jìn)度等信息,來進(jìn)行相關(guān)操作耳鸯,其它的回調(diào)可根據(jù)需求選擇湿蛔。
3、WebViewClient
WebViewClient用來輔助WebView處理各種通知县爬、請(qǐng)求事件的阳啥,例如在WebView中點(diǎn)擊請(qǐng)求新的鏈接、頁面加載開始财喳、結(jié)束等:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
其它的回調(diào)可根據(jù)需求選擇察迟。
4斩狱、上\下一個(gè)頁面
private void goBack(){
if (mWebView.canGoBack()){
mWebView.goBack();
}else{
finish();
}
}
private void goForward() {
if (mWebView.canGoForward()) {
mWebView.goForward();
}
}
就是通過WebView的goBack()、goForward()方法扎瓶。
5所踊、下載
mWebView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,
long contentLength) {
}
});
通過DownloadListener可以拿到下載相關(guān)的信息。
二概荷、java與js交互
首先編寫一個(gè)簡(jiǎn)單的H5:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>js test</title>
</head>
<script type="text/javascript">
function click1(){
window.client.showMessage("來自js的消息");
}
function click2(msg){
alert("來自java代碼的消息:" + msg)
}
</script>
<body>
<input id="one" type="button" value="js調(diào)用java代碼" onclick="click1()"
style="width:300px; height:150px; font-size:35px"/>
</body>
</html>
內(nèi)容很簡(jiǎn)單秕岛,兩個(gè)函數(shù)click1、click2误证,一個(gè)按鈕继薛,點(diǎn)擊按鈕執(zhí)行click1函數(shù)。
將改H5文件放到assets目錄愈捅,之后用WebView加載改H5:
mWebView.loadUrl("file:///android_asset/test.html");
接下來在Activity中編寫一個(gè)特殊的類:
class JsOperation {
@JavascriptInterface
public void showMessage(String msg) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
}
然后注入到WebView中:
mWebView.addJavascriptInterface(new JsOperation(), "client");
注意和js中的這行代碼對(duì)比下:
window.client.showMessage("來自js的消息");
其中client
就是addJavascriptInterface()的第二個(gè)參數(shù)惋增,當(dāng)然這個(gè)參數(shù)可以自定義,但要保持一致改鲫。js中調(diào)用的showMessage()方法诈皿,就是我們JsOperation類中的方法。
點(diǎn)擊H5中的按鈕像棘,可以看到一個(gè)Toast提示:
到這里就完成了js對(duì)java代碼的調(diào)用稽亏,接下來看如下通過java代碼調(diào)用js。
其實(shí)很簡(jiǎn)單:
mWebView.loadUrl("javascript:click2" + "(" + 1008611 + ")");
這樣就可以執(zhí)行js中的click2函數(shù)了缕题。我們通過模擬器返回鍵執(zhí)行這行代碼截歉,可以看到一個(gè)提示框,即click2函數(shù)得到執(zhí)行:
ps:按鈕上的文字錯(cuò)了烟零,應(yīng)該是java代碼調(diào)用js瘪松。
三、模擬原生應(yīng)用的頁面跳轉(zhuǎn)
首先看一下效果:
確實(shí)是原生的界面跳轉(zhuǎn)感覺锨阿。
首先可以在Activity的onCreate()中創(chuàng)建一個(gè)棧宵睦,并將當(dāng)前Activity入棧:
if (mStack == null) {
mStack = new Stack<>();
}
mStack.push(this);
在WebView中繼續(xù)加載新頁面時(shí):
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Intent intent = new Intent(MainActivity.this, MainActivity.class);
intent.putExtra("url", url);
startActivity(intent);
return true;
}
我們重寫了shouldOverrideUrlLoading()
,重新啟動(dòng)當(dāng)前Activity來加載新鏈接墅诡,則一個(gè)新的Activtiy會(huì)入棧壳嚎,這樣就有了跳轉(zhuǎn)的效果。
在返回上一個(gè)界面時(shí)進(jìn)行出棧操作:
private void popActivity() {
if (mStack.size() > 0) {
mStack.remove(this);
this.finish();
}
}