標(biāo)簽: android
使用場景
如果你想發(fā)布一個web application 作為你應(yīng)用客戶端的一部分脚粟,你可以使用webview來實(shí)現(xiàn)覆旱。webview 類是android view類的擴(kuò)展,它可以讓你顯示web頁面作為你Activity布局的一部分核无。webview不包含瀏覽器的完整特性扣唱,例如導(dǎo)航控制和地址欄。它僅僅是最基本的功能团南,就是展示web頁面噪沙。
當(dāng)你應(yīng)用的頁面需要及時的更新,例如給用戶提供的協(xié)議吐根,或者用戶指南正歼,這時使用webview作為你的應(yīng)用頁面是很合適的。在你的應(yīng)用里面拷橘,你可以創(chuàng)建一個包含webview的Activity局义,然后在線顯示文檔。
如何使用
- 添加一個webview 到你的application
簡單的包含一個
<WebView>
元素到你的標(biāo)簽
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
- 綁定webview冗疮,使用
loadurl()
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.example.com");
- 在它能工作之前你還必須聲明
Intent
權(quán)限
<manifest ... >
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
以上就是最基本的webview使用萄唇,是不是很簡單呢?
在你的webview中使用javaScript
如果在你加載的web頁面中需要使用JavaScript赌厅,那么你必須讓JavaScript能夠使用穷绵,一旦javaScript可以使用,你就可以在你的應(yīng)用代碼和JavaScript之間創(chuàng)建接口特愿。
如何啟用JavaScript
在默認(rèn)的情況下JavaScript是沒有啟用的仲墨。你可以通過連接這個webview的websetting
來開啟它勾缭。你可以通過getSetting()
方法獲取webseting
,然后使用setJavaScriptEnable()
方法來開啟它目养。
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
當(dāng)然webSetting
還提供了很多其他很有幫助的設(shè)置俩由,具體的內(nèi)容可以參考谷歌的官方api。
使你的JavaScript代碼和android的應(yīng)用代碼綁定
當(dāng)你在開發(fā)web應(yīng)用的使用癌蚁,你可能需要為你的應(yīng)用特別開發(fā)一個webview,你可以在JavaScript代碼和應(yīng)用客戶端之間創(chuàng)建接口幻梯,例如你可以創(chuàng)建JavaScript代碼調(diào)用android代碼你的方法去顯示一個dialog,而不是使用JavaScript的alert()
的功能努释。
想要將JavaScript代碼和android代碼綁定碘梢,可以使用addJavasriptInterface()
方法,通過這個類的實(shí)例就可以將JavaScript和接口名綁定伐蒂,然后JavaScript就可以調(diào)用這個類的方法煞躬。
/***
*這是JavaScript與android代碼綁定的實(shí)現(xiàn)類
*/
public class AppJavascriptInterface {
Context mContext;
/**初始化接口,設(shè)置上下文 */
WebAppInterface(Context c) {
mContext = c;
}
/**從web頁面中顯示一個toast*/
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
注意:如果你的targetSdkVersion
大于17的話逸邦,你必須在任何JavaScript可以獲取的方法前加上@JavascriptInterface
注解恩沛,而且這個方法的訪問權(quán)限必須是public
的。如果你不加注解缕减,可能在高于android4.2的手機(jī)中將無法獲取到接口方法雷客。
上面的AppJavascriptInterface
類為web頁面創(chuàng)建了一個彈出Toast的方法。將這個類的實(shí)例綁定到運(yùn)行的webview上
WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new AppJavascriptInterface(this), "Android");
在webview的javaScript低嗎中可以調(diào)用android
來調(diào)用接口里的方法桥狡。
<input type="button" value="你好" onClick="showAndroidToast('你好')" />
<script type="text/javascript">
function showAndroidToast(msg) {
Android.showToast(msg);
}
</script>
這里我們不需要在JavaScript中初始化android接口搅裙,webview會自動進(jìn)行。
注意:使用這種方式是一把雙刃劍总放,在極大方便了我們的同時呈宇,也不可避免的帶來了很多安全問題,應(yīng)以web頁面的內(nèi)容通常來自于外部局雄,是未知的,當(dāng)JavaScript代碼可以調(diào)用android內(nèi)部代碼的時候存炮,危險也就可能出現(xiàn)循集,所以我們應(yīng)當(dāng)盡可能的避免這種情況姻报,除非必須使用這種特性。同時我們也應(yīng)該不讓用戶導(dǎo)航到不是我們自己的頁面,當(dāng)超出頁面范圍的時候文留,可以使用外部的瀏覽器來時實(shí)現(xiàn),而不是我們內(nèi)置的webview舞终。
處理頁面導(dǎo)航
當(dāng)用用戶點(diǎn)擊webview中的一個連接的時候废膘,android系統(tǒng)默認(rèn)的處理方式時啟動一個新的應(yīng)用來處理這個連接。默認(rèn)情況下般又,android是打開一個瀏覽器來加載URL彼绷,然而你可以重寫webview這種行為方式巍佑,這樣連接就可以用內(nèi)置的webview打開,同時還能在你webview中的歷史記錄經(jīng)行前進(jìn)和后退導(dǎo)航寄悯。
打開用戶點(diǎn)擊的連接萤衰,可以提供一個為你的webview提供一個webviewClient
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new WebViewClient());
如果你想更多的控制連接加載,你可以創(chuàng)建自己的客戶端重寫shouldOverriderUrlLoad()
的方法
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//如果這是我們自己的站點(diǎn)域名不需要重寫
if (Uri.parse(url).getHost().equals("www.example.com")) {
return false;
}
// 不是自己的站點(diǎn)猜旬,啟動另一個應(yīng)用
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
}
創(chuàng)建這個類的實(shí)例
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new MyWebViewClient());
導(dǎo)航歷史記錄界面
當(dāng)你的webview覆寫URL加載時他將自動累計(jì)URL訪問的歷史記錄頁面你可以通過goBack()
和goForward()
方法脆栋。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 當(dāng)返回動作執(zhí)行的時候,監(jiān)聽是否有可返回的歷史記錄
if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
//沒有歷史記錄頁面返回洒擦,屬于系統(tǒng)正常退出
return super.onKeyDown(keyCode, event);
}
如果有歷史記錄存在椿争,則canGoBack()
方法返回true
,同樣canGoForward()
也是如此熟嫩,一旦用戶到達(dá)了歷史記錄的末尾丘薛,再次調(diào)用goBack()
或者goForward()
,它將什么事也不做。