`
jayghost
  • 浏览: 429451 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于Android中Java与Javascript之间的传值研究

 
阅读更多

 

Android中提供的WebView的功能不可谓不强大,并且WebView对于Javascript也能够很好的支持,Google官网也提供了在WebView中如何实现的JavaJavaScript的互相访问。来看一下源代码:

1 WebViewDemo.java文件:

 

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");
    }
}

 来分析一下这段代码:

WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
 首先生成一个WebSettings对象,其次setJavaScriptEnabled(true);通过这句声明使WebView能够支持JavaScript脚本。

紧接着mWebView.addJavascriptInterface这句,这个方法的原型如下:

addJavascriptInterface(Object obj,String interfaceName),该方法将一个java对象绑定到一个javascript对象中,而这个javascript对象的名字就是第二个参数interfaceName。这样在WebView进行初始化以后,就可以通过window. interfaceName来访问Java对象了。这里的interfaceName就是Demo

第一个参数则是个初始化了一个Java的类,注意这里的clickOnAndroid()方法,

这里文档里是这样描述的The Java object that is bound runs in another thread and not in the thread that it was constructed in.

也就是说addJavascriptInterface这里要绑定的类新申请了个进程来处理,这个是需要注意的地方,因此这也是使用了Handler的目的。

mWebView.loadUrl("file:///android_asset/demo.html");这句话是加载了本地的demo.html页面,这个页面是存放在工程的assets下的,为了让WebViewapk文件中加载assetsAndroid SDK提供了一个schema,前缀为"file:///android_asset/"WebView遇到这样的schema,就去当前包中的assets目录中找内容。如上面的“file:///android_asset/demo.html

mWebView.loadUrl("javascript:wave()");这句话就是Java调用Javascript的函数了。这个wave()是在页面中的Javascript脚本中定义的。

下面再来看看在demo.html中是怎样调用的Java函数的,下面是demo.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>
 其中wave() 是被Java程序调用的。<a onClick="window.demo.clickOnAndroid()">通过点击来调用window.demo.clickOnAndroid()函数,这样就调用了JavaclickOnAndroid()方法。

这样,通过上面的例子可以看出,实现JavaJavascript之间的交互是比较容易的,下面再来看看如何实现JavaJavascript的传值。

基本上传值的主要思路就是通过函数的参数来进行的,把上面例子进行了修改,将函数加了参数,看修改后如下:

public void clickOnAndroid(final String str)在这个函数添加了一个String的参数,在HTML里的调用改为如下即可:

window.demo.clickOnAndroid(str)

其中参数str可以在调用以前设置好var str = 1234567890,任意一个值或者是你自己需要得到的页面中的某一个值。这样就实现了JavaScriptJava传值。

那么JavaJavaScript传值也是采用的函数参数的方式,看一下HTML中的改动:

function wave(str)

Java中也需要做些改动,

mWebView.loadUrl("javascript:wave(‘"+str+"’)");

中间的strString类型,将需要传给JavaScript的值放入其中。这样就实现了JavaJavaScript的传值过程。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics