`
crazier9527
  • 浏览: 995956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 中 java 与 webview 的交互(转)

阅读更多

WebView初探 了解到WebView的强大,。听说WebView对Javascript的支持也很强,想从网上找些例子,还很难找,最终从google老家找了一个Java和Javascript互调的例子 ,当时看了,下巴“咣当”就掉在地上了,太强了!这样也行?
整个Eclipse ADT工程例子中都有,这里重点分析一下代码:

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>  
        <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的目的。

 

转自:http://www.iteye.com/topic/376674

 

----------------------------------------------------------------------------------------------------------------------------------

在看懂这篇文章之前首先要有javascript基础。

(1) js调用android的方法:
WebView wView;
wView. addJavascriptInterface (Object obj, String interfaceName);
是实例化一个对象,在html的js中调用,第二个参数是实例化对象的别名,如果要使用这个obj,则在js中使用的名字就是interfaceName。

public class jsWebDemo extends Activity {
WebView wView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
wView = (WebView)findViewById(R.id.wv1);

WebSettings wSet = wView.getSettings();
wSet.setJavaScriptEnabled(true);

ProxyBridge pBridge = new ProxyBridge();
wView.addJavascriptInterface(pBridge, “AliansBridge”);

wView.loadUrl(“file:///android_asset/index.html“);

}

private class ProxyBridge {
public int one () {
return 1;
}
}

}

来看一下index.html的内容:
<html>
<script language=”javascript”>
/* This function is invoked by the activity */
function wave() {
alert(“1″);
document.getElementById(“droid”).src=”android_waving.png”;
alert(“2″);
}
</script>
<body>
<div id=”output”>Test page.</div>

<a onClick=”window.demo.clickOnAndroid()”>
<div style=”width:100px;
margin:0px auto;
padding:10px;
text-align:center;
border:2px solid #202020;” >
<img id=”droid” src=”android_normal.png”/><br>
Click me!
</div>
</a>
<input type=”submit” value=”change to 1″ onclick=”document.getElementById(‘output’).innerHTML =AliansBridge.one()” />
</body>
</html>
这里的AliansBridge即是调用的JAVA对象。

要注意的是,如果你只有一个方法需要被js调用只new一个对象就行:

ProxyBridge pBridge = new ProxyBridge();
wView.addJavascriptInterface(pBridge, “AliansBridge”);

如果你需要调用好多个方法,就要把整个android程序所在的类本身实例化传递进去:

wView.addJavascriptInterface(this, “AliansBridge”);

(2) android调用js的方法:wView.setWebChromeClient (WebChromeClient client)
要用到Handler更新UI,Handler mHandler = new Handler();

mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.addJavascriptInterface(new Object(){
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
public void clickOnAndroid() {

mHandler.post(new Runnable() {
public void run() {
mWebView.loadUrl(“javascript:wave()”);
}
});
}
}, “demo”);

同理,在html中必须有一个名为demo的对象调用clickOnAndroid()方法。

/**
* Provides a hook for calling “alert” from javascript. Useful for
* debugging your javascript.
*/
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
result.confirm();
return super.onJsAlert(view, url, message, result);
}
}

 

 

转自:http://otheri.com/

分享到:
评论
2 楼 renfu8888 2011-12-07  
大侠 原码有否 精华呢
1 楼 FreddieXian 2010-07-20  
good 

相关推荐

Global site tag (gtag.js) - Google Analytics