天天看點

android webview讀取html和js

 webview對javascript的支援也很強,google一個java和javascript互調的例子  

整個eclipse adt工程例子中都有,這裡重點分析一下代碼:

java代碼  

android webview讀取html和js

public class webviewdemo extends activity {  

    private webview mwebview;  

    private handler mhandler = new handler();  

    public void oncreate(bundle icicle) {  

        super.oncreate(icicle);  

        setcontentview(r.layout.webviewdemo);  

        mwebview = (webview) findviewbyid(r.id.webview);  

        websettings websettings = mwebview.getsettings();  

        websettings.setjavascriptenabled(true);  

        mwebview.addjavascriptinterface(new object() {  

            public void clickonandroid() {  

                mhandler.post(new runnable() {  

                    public void run() {  

                        mwebview.loadurl("javascript:wave()");  

                    }  

                });  

            }  

        }, "demo");  

        mwebview.loadurl("file:///android_asset/demo.html");  

    }  

}  

這裡的重點是addjavascriptinterface(object obj,string interfacename)方法,該方法将一個java對象綁定到一個javascript對象中,javascript對象名就是interfacename,作用域是global。這樣初始化webview後,在webview加載的頁面中就可以直接通過javascript:window.demo通路到綁定的java對象了。來看看在html中是怎樣調用的:

html代碼  

android webview讀取html和js

<html>  

        <script language="javascript">  

                function wave() {  

                    document.getelementbyid("droid").src="android_waving.png";  

                }  

        </script>  

        <body>  

            <a onclick="window.demo.clickonandroid()">  

                                <img id="droid" src="android_normal.png"/><br>  

                                click me!  

            </a>  

        </body>  

</html>  

 這樣在javascript中就可以調用java對象的clickonandroid()方法了,wave()方法是java中調用javascript的例子。

這裡還有幾個知識點:

1)為了讓webview從apk檔案中加載assets,android sdk提供了一個schema,字首為"file:///android_asset/"。webview遇到這樣的schema,就去目前包中的assets目錄中找内容。如上面的"file:///android_asset/demo.html"

2)addjavascriptinterface方法中要綁定的java對象及方法要運作另外的線程中,不能運作在構造他的線程中,這也是使用handler的目的。