在Android手機(jī)中內(nèi)置了一款高性能webkit內(nèi)核瀏覽器棉浸,在SDK中封裝為一個(gè)叫做WebView組件抵卫。下面總結(jié)一下使用webview
一、webview的基本使用方法
1. 添加權(quán)限:AndroidManifest.xml中設(shè)置權(quán)限"android.permission.INTERNET",否則會出Web page not available錯(cuò)誤逻炊。
2. 在要Activity中生成一個(gè)WebView組件:WebView webView = new WebView(this);或者可以在activity的layout文件里添加webview控件
3. 設(shè)置WebView基本信息:
mWebView = (WebView) findViewById(R.id.wb);
mWebView.getSettings().setJavaScriptEnabled(true);//支持javascript
mWebView.requestFocus();//觸摸焦點(diǎn)起作用
mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);//取消滾動條
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//設(shè)置允許js彈出alert對話框
mWebView.addJavascriptInterface(new JsInteration(), "control");//js訪問android秤掌,定義接口
//設(shè)置了Alert才會彈出,重新onJsAlert()方法return true可以自定義處理信息
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
{
//return super.onJsAlert(view, url, message, result);
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
return true;
}
});
4. 設(shè)置WevView要顯示的網(wǎng)頁:互聯(lián)網(wǎng)用:webView.loadUrl("http://www.google.com"); 本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets文件中
5. 如果希望點(diǎn)擊鏈接由自己處理再来,而不是新開Android的系統(tǒng)browser中響應(yīng)該鏈接蒙兰。給WebView添加一個(gè)事件監(jiān)聽對象(WebViewClient)并重寫其中的一些方法: shouldOverrideUrlLoading:對網(wǎng)頁中超鏈接按鈕的響應(yīng)。當(dāng)按下某個(gè)連接時(shí)WebViewClient會調(diào)用這個(gè)方法芒篷,并傳遞參數(shù)
public boolean shouldOverrideUrlLoading(WebView view,String url){ view.loadUrl(url); return true; }
6. 處理https請求webView默認(rèn)是不處理https請求的搜变,頁面顯示空白,需要進(jìn)行如下設(shè)置:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view,
SslErrorHandler handler, SslError error) {
handler.proceed();
// handler.cancel();
// handler.handleMessage(null); }
});
onReceivedSslError為webView處理ssl證書設(shè)置
其中handler.proceed();表示等待證書響應(yīng)handler.cancel();表示掛起連接针炉,為默認(rèn)方式handler.handleMessage(null);
可做其他處理另外還有其他一些可重寫的方法
1挠他,接收到Http請求的事件onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
2,載入頁面完成的事件public void onPageFinished(WebView view, String url){ }同樣道理篡帕,我們知道一個(gè)頁面載入完成殖侵,于是我們可以關(guān)閉loading條,切換程序動作镰烧。
3拢军,載入頁面開始的事件public void onPageStarted(WebView view, String url, Bitmap favicon) { }這個(gè)事件就是開始載入頁面調(diào)用的,通常我們可以在這設(shè)定一個(gè)loading的頁面怔鳖,告訴用戶程序在等待網(wǎng)絡(luò)響應(yīng)茉唉。 通過這幾個(gè)事件,我們可以很輕松的控制程序操作结执,一邊用著瀏覽器顯示內(nèi)容度陆,一邊監(jiān)控著用戶操作實(shí)現(xiàn)我們需要的各種顯示方式,同時(shí)可以防止用戶產(chǎn)生誤操作昌犹。
4. 如果用webview點(diǎn)鏈接看了很多頁以后坚芜,如果不做任何處理,點(diǎn)擊系統(tǒng)“Back”鍵斜姥,整個(gè)瀏覽器會調(diào)用finish()而結(jié)束自身,如果希望瀏覽的網(wǎng)頁回退而不是退出瀏覽器沧竟,需要在當(dāng)前Activity中處理并消費(fèi)掉該Back事件铸敏。 覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法。
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
webView.goBack();// 返回前一個(gè)頁面
return true;
}
return super.onKeyDown(keyCode, event);
}
二悟泵、webview與js的交互(相互調(diào)用參數(shù)杈笔、傳值)
前端網(wǎng)頁全部代碼,文章最后有示例項(xiàng)目完整源碼
<!DOCTYPE html><html><head> <meta charset="utf-8">
<title>jaydenxiao遇上了webview</title>
<script>
function sayHello() {
alert("我是無參無返回toast")
}
function alertMessage(message) {
alert(message)
}
function toastMessage(message) {
window.control.toastMessage(message)
}
function sumToJava(number1, number2){
window.control.onSumResult(number1 + number2)
}
function sumToJava2(number1, number2) {
return number1 + number2;
}
</script>
</head><body>
<button type="button" id="button" onclick="toastMessage('js調(diào)用了android方法')">js訪問android中方法
</button>
</body>
</html>
調(diào)用示例:
js調(diào)用Java
調(diào)用格式為window.jsInterfaceName.methodName(parameterValues)此例中我們使用的是control作為注入接口名稱。
function toastMessage(message) {
window.control.toastMessage(message)
}
function sumToJava(number1, number2){
window.control.onSumResult(number1 + number2)
}
Java調(diào)用JS
webView調(diào)用js的基本格式為webView.loadUrl(“javascript:methodName(parameterValues)”)****1. android調(diào)用js無參無返回值函數(shù)
final String call = "javascript:sayHello()";
mWebView.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl(call);
}
});
2. android調(diào)用js有參無返回值函數(shù)
final String call = "javascript:alertMessage(\"" + "我是android傳過來的內(nèi)容,hey man" + "\")";
mWebView.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl(call);
}
}
);
3. android調(diào)用js有參有返回值函數(shù)(4.4之前)
Android在4.4之前并沒有提供直接調(diào)用js函數(shù)并獲取值的方法糕非,所以在此之前蒙具,常用的思路是 java調(diào)用js方法球榆,js方法執(zhí)行完畢,再次調(diào)用java代碼將值返回禁筏。
(1).android調(diào)用js代碼
final String call = "javascript:sumToJava(1,2)";mWebView.post(new Runnable() {
@Override public void run() {
mWebView.loadUrl(call); }
});
(2).js函數(shù)處理持钉,并將結(jié)果通過調(diào)用android方法返回
網(wǎng)頁端:
function sumToJava(number1, number2){ window.control.onSumResult(number1 + number2) }
(3).android在回調(diào)方法中獲取js函數(shù)返回值
@JavascriptInterfacepublic void onSumResult(int result) {
Toast.makeText(getApplicationContext(), "我是android調(diào)用js方法(4.4前),入?yún)⑹?和2篱昔,
js返回結(jié)果是" + result, Toast.LENGTH_LONG).show();
}
4. android調(diào)用js有參有返回值函數(shù)(4.4以上):****
Android 4.4以上使用evaluateJavascript即可每强。這里展示一個(gè)簡單的交互示例 具有返回值的js方法js代碼如下:
function sumToJava2(number1, number2) {return number1 + number2;}
android代碼如下:
@TargetApi(Build.VERSION_CODES.KITKAT)
public void Android2JsHaveParmHaveResult2(View view) {
mWebView.evaluateJavascript("sumToJava2(3,4)", new ValueCallback<String>() {
@Override
public void onReceiveValue(String Str) {
Toast.makeText(getApplicationContext(), "我是android調(diào)用js方法(4.4后),入?yún)⑹?和4州刽,
js返回結(jié)果是" + Str, Toast.LENGTH_LONG).show();
}
} );
}
知識點(diǎn)
1.圖片自適應(yīng)
當(dāng)我用webview直接顯示該網(wǎng)頁的時(shí)候空执,圖片并不能自適應(yīng),只能夠顯示一部分穗椅。那么如何做到自適應(yīng)手機(jī)屏幕呢辨绊?具體見代碼:
WebSettings webSettings = view.getSettings();
// User settings
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//適應(yīng)內(nèi)容大小
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
注意:對于比較復(fù)雜的網(wǎng)頁,該方法不一定有效匹表,需要開發(fā)者自行測試邢羔。
2.獲取圖片地址
那如何下載網(wǎng)頁中的圖片呢?我們可以通過webview中的setOnLongClickListener獲取HitTestResult對象桑孩,通過判斷該對象的類型獲取點(diǎn)擊圖片的URL拜鹤,然后把圖片下載到本地。
webwiew.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(final View v) {
final WebView.HitTestResult result = ((WebView) v).getHitTestResult();
int type = result.getType();
if (type == WebView.HitTestResult.IMAGE_TYPE) {
WebView.HitTestResult result = ((WebView) v).getHitTestResult();
String imgurl = result.getExtra();//圖片地址
}
return false;
}
});
HitTestResult的類型有:
類型 | 名稱 | 作用 |
---|---|---|
int | ANCHOR_TYPE | 已經(jīng)廢棄 |
int | EDIT_TEXT_TYPE | 打開一個(gè)可編輯的區(qū)域 |
int | EMAIL_TYPE | 郵件 |
int | GEO_TYPE | map地址 |
int | IMAGE_ANCHOR_TYPE | 已經(jīng)廢棄 |
int | IMAGE_TYPE | 圖片 |
int | PHONE_TYPE | 電話號碼 |
int | SRC_ANCHOR_TPE | html的a標(biāo)簽流椒,內(nèi)容是一個(gè)http地址 |
int | SRC_IMAGE_ANCHOR_TYPE | html的a標(biāo)簽敏簿,內(nèi)容由http及image |
int | UNKNOW_TYPE | 未知內(nèi)容 |