標籤:
參考http://blog.csdn.net/chenzheng_java/article/details/6260872
<html>
<header>
<title></title>
<script type="text/javascript">
function show()
{
alert("Hello world!");
}
function disable()
{
document.getElementById("btn").disabled=true;
}
</script>
</header>
<body>
<button onclick="show()" id="btn">click</button>
<button onclick="window.demo.demoTest()" >click</button>
</body>
</html>
public class MainActivity extends AppCompatActivity {
private WebView webView;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
return true;
}
});
webView.loadUrl("file:///android_asset/demo.html");
// JavaScriptInterface整個方法用於和html的事件進行互動。也就是說可以在html中調用Activity中的方法。實現Html和activity的互動。
// q其中的demoTest整個方法名要和html 中的調用的方法名一樣。當然如果想要在activity中調用html中的方法呢,
// webView.loadUrl("javascript:disable()"); 其中disable()是javascript中的方法名
webView.addJavascriptInterface(new Object() {
@JavascriptInterface
public void demoTest() {
handler.post(new Runnable() {
@Override
public void run() {
Log.i("addJavascriptInterface", "調用了該方法哦");
Toast.makeText(MainActivity.this, "Message", Toast.LENGTH_SHORT).show();
}
});
}
}, "demo");
}
public void onClick(View view)
{
webView.loadUrl("javascript:disable()");
}
注意:
1)為了讓WebView從apk檔案中載入assets,Android SDK提供了一個schema,首碼為"file:///android_asset/"。WebView遇到這樣的schema,就去當前包中的assets目錄中找內容。如上面的"file:///android_asset/demo.html"
2)addJavascriptInterface方法中要綁定的Java對象及方法要運行另外的線程中,不能運行在構造他的線程中,這也是使用Handler的目的。
但是在JELLY_BEAN_MR1,也就是API17,4.2以後,需要在pulbic 方法之上加上 @JavascriptInterface,否則不會起作用。
3)如果你要訪問網路,請在androidManifest.xml中加上許可權<uses-permission android:name="android.permission.INTERNET"></uses-permission>
---------------------------------------------------------------------------------------------------------
我們在程式中可以看到,android訪問網頁以及與javascript互動主要用到了這麼幾個類:
WebView :我們可以認為它就是一個瀏覽器,會對使用者訪問的網址進行解析,下載,渲染……,然後返回給使用者一個網頁。 其內部使用的是webkit渲染引擎,它還包含了一些我們經常使用的功能,比如放大、縮小網頁(需要在webSetting中先設定WebSettings.setBuiltInZoomControls(boolean));前進、後退……。
預設情況下,webView對javascript和頁面的錯誤都是忽略的。很多時候,如果我們想要載入一個uri,可能我們更多的會使用這種形式:
[java] view plain copy
Uri uri = Uri.parse("http://www.example.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
api中為我們提供了一個通過webView載入頁面的例子,
我們可以看到,主要有loadUrl()和loadData()方法。這裡請注意各個參數的含義哦、
-------------------------------------------------------------
此外,android還為我們提供了一些類來輔助我們的webview的使用。
WebViewClient:
。WebViewClient就是協助WebView處理各種通知、請求事件的,具體來說包括:
onLoadResource:通知webView載入url指定的資源時觸發
onPageStart:頁面開始載入時觸發
onPageFinish:頁面載入完畢時觸發
onReceiveError:出現錯誤時觸發
WebChromeClient:
WebChromeClient是輔助WebView處理Javascript的對話方塊,網站表徵圖,網站title,載入進度等
onCloseWindow(關閉WebView)
onCreateWindow()
onJsAlert (WebView上alert是彈不出來東西的,需要定製你的WebChromeClient處理彈出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
api中提供給我們一個執行個體:
WebSetting:和WebView是一一綁定的,控制webview的一些基礎設定資訊,如是否識別javascript,網頁是否可放大縮小等。
--------------------------------------------------------------------------
如果我們想通過webview進行曆史網頁查看時,一定要注意,先通過如下方法判斷下是否可執行該操作才好:
然後就可通過
voidgoBack()
Go back in the history of this WebView.
voidgoBackOrForward(int steps)
Go to the history item that is the number of steps away from the current item.
voidgoForward()
Go forward in the history of this WebView.
三個方法進行操作了,其中goBackOrForward傳遞進負數時為back操作,正數為forward操作。
Webview和Html