WebView之javascript与android交互基础加强

一、什么是js与android交互?

  通俗一点就是使用js代码调用java代码,或者使用java代码调用js代码。

二、为什么要使用js与java代码交互?

  1.可以做一些js网页做本身处理不了的事情。例如:在网页上调用Android本地打电话,发短信功能、在网页上调用Android手机通讯录、在网页上调用第三方应用、在网页上调用一些Android的本地化处理(操作IO,数据库)等。

  2.可以实现js开发人员与android开发人员合作开发。例如:js开发人员开发js代码供android开发人员调用,android开发人员就不必写js代码,可以专注于andrid开发,用到js的时候直接调用js代码就可以了。(反之亦然)

  3.可以实现网页的动态更新。例如:可以利用js代码调用java的更新数据显示到网页上以达到动态更新网页的目的。

三、js代码调用java代码操作步骤

  1.开启使用js功能

WebView之javascript与android交互基础加强
webSettings.setJavaScriptEnabled(true);
WebView之javascript与android交互基础加强

  2.设置编码默认编码格式(编码格式要和html编码格式对应)

WebView之javascript与android交互基础加强
webSettings.setDefaultTextEncodingName("gbk");
WebView之javascript与android交互基础加强

  3.注入提供的java对象到webView:主要是这段代码,解释一下,第一个参数定义了一个对象,该对象中可以写任意的方法,供js代码调用。第二个参数是该自定义对象的一个别名。js调用该对象的方法时会使用到该别名。调用格式为:对象名.方法名。例如:jsobject.androidAlert();调用android的alert对话框。

WebView之javascript与android交互基础加强
webView.addJavascriptInterface(new JsObject(), "jsobject");
WebView之javascript与android交互基础加强

  4.设置WebChromeClient对象,并实现其中的onJsAlert、onJsConfirm等方法。注意这里必须要实现这几个方法,不然js调用java代码弹框时可能没有反应

WebView之javascript与android交互基础加强
       @Override
            public boolean onJsAlert(WebView view, String url, String message,
                    JsResult result) {
                // TODO Auto-generated method stub
                return super.onJsAlert(view, url, message, result);
            }

            @Override
            public boolean onJsConfirm(WebView view, String url,
                    String message, JsResult result) {
                // TODO Auto-generated method stub
                return super.onJsConfirm(view, url, message, result);
            }

            @Override
            public boolean onJsPrompt(WebView view, String url, String message,
                    String defaultValue, JsPromptResult result) {
                // TODO Auto-generated method stub
                return super.onJsPrompt(view, url, message, defaultValue,
                        result);
            }
WebView之javascript与android交互基础加强

四、android代码调用js代码

  这个相对比较简单,只需要一行代码就能搞定:

  例如:

WebView之javascript与android交互基础加强
//android调用js代码
webView.loadUrl("javascript:test_alert()");
WebView之javascript与android交互基础加强

做完以上几步后就可以实现真正调用了。下面给出完整代码

一、HTML代码jshtml.html(改代码放在assets文件夹下)

WebView之javascript与android交互基础加强
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
    <title>这是一个HTML</title>  
  
    <script type="text/javascript">  
         /*js调用android的方法*/  
          function jsCallAndroidAlert(){
              jsobject.androidAlert();
          }

        function test_alert() {  
        /* 弹出对话框 */  
            alert("啊哈!连Android系统都调用JS函数了");  
        }  

    </script>  
</head>  
    <body>  
        <button onclick="jsCallAndroidAlert()">test</button>  
        <button onclick="test_alert()">test_alert</button>    
    </body>  
</html>  
WebView之javascript与android交互基础加强

二、MainActivity.java

WebView之javascript与android交互基础加强
package com.yw.webkitdemo;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;

@SuppressLint("JavascriptInterface")
public class MainActivity extends Activity implements android.view.View.OnClickListener{
    private WebView webView;
    private ProgressBar progressBar;
    private Button btn_js;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        btn_js = (Button)findViewById(R.id.btn_js);
        btn_js.setOnClickListener(this);
        progressBar = new ProgressBar(this, null,
                android.R.attr.progressBarStyleHorizontal);
        progressBar.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                5));

        webView = (WebView) findViewById(R.id.webView);
        WebSettings webSettings = webView.getSettings();
        // 启用javascrip功能
        webSettings.setJavaScriptEnabled(true);
        //设置可以使用中文,否则会出现中文乱码
        webSettings.setDefaultTextEncodingName("gbk");
        webView.addView(progressBar);
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress == 100) {
                    progressBar.setVisibility(View.GONE);
                } else {
                    if (progressBar.getVisibility() == View.GONE)
                        progressBar.setVisibility(View.VISIBLE);
                    progressBar.setProgress(newProgress);
                }
                super.onProgressChanged(view, newProgress);
            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message,
                    JsResult result) {
                // TODO Auto-generated method stub
                return super.onJsAlert(view, url, message, result);
            }

            @Override
            public boolean onJsConfirm(WebView view, String url,
                    String message, JsResult result) {
                // TODO Auto-generated method stub
                return super.onJsConfirm(view, url, message, result);
            }

            @Override
            public boolean onJsPrompt(WebView view, String url, String message,
                    String defaultValue, JsPromptResult result) {
                // TODO Auto-generated method stub
                return super.onJsPrompt(view, url, message, defaultValue,
                        result);
            }
        });
        /*
         * 此段代码在不做处理的情况下会弹出多个浏览器选择界面 webView.loadUrl("http://www.baidu.com/");
         */
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }
        });
//         webView.loadUrl("http://www.baidu.com/");
        /**
         * 自定义对象,以及对象别名
         * 自定义对象中定义的方法可以供js调用
         * function jsCallAndroidAlert(){
              jsobject.androidAlert();
              }
         */
        webView.addJavascriptInterface(new JsObject(), "jsobject");
        //加载我们自定义的html网页并将其显示在webView上
        webView.loadUrl("file:///android_asset/jshtml.html");
    }

    /**
     * 此类的方法对应html中js的方法,供js调用Android的方法
     * 
     * @author Administrator
     * 
     */
    class JsObject {
        public void androidAlert() {
            AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
            dialog.setTitle("温馨提示");
            dialog.setMessage("js调用了Android的Alert,测试完毕是否退出?");
            dialog.setNegativeButton("否", new OnClickListener() {
                
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    
                }
            });
            dialog.setPositiveButton("是", new OnClickListener() {
                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            AlertDialog dialog2 = dialog.create();
            dialog2.show();
            Toast.makeText(MainActivity.this, "您使用js调用了alert方法",
                    Toast.LENGTH_LONG).show();
        }

        public void androidConfirm() {
            Toast.makeText(MainActivity.this, "您使用js调用了confirm方法",
                    Toast.LENGTH_LONG).show();
        }
    }

    /**
     * 对系统的back键进行设置
     */
    @Override
    public void onBackPressed() {
        if (webView != null && webView.canGoBack()) {
            webView.goBack();
        } else {
            super.onBackPressed();
        }

    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.btn_js:
            //android调用js代码
            webView.loadUrl("javascript:test_alert()");
            break;
        }
    }
}
WebView之javascript与android交互基础加强

三、main_layout.xml文件

WebView之javascript与android交互基础加强
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <Button
        android:id="@+id/btn_js"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="调用javascript函数" />

</LinearLayout>
WebView之javascript与android交互基础加强

完成。

WebView之javascript与android交互基础加强

上一篇:Android基于IIS的APK下载(二)显示更新列表


下一篇:android UI进阶之实现listview中checkbox的多选与记录