在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的JavaScript进行交互,Android也对交互做了很好的封装,所以很容易实现例如:点击网页中的按钮Android调用原生对话框,点击网页中的电话号码调用Android拨号APP。这篇给大家介绍下如何实现Android与HTML+JS的交互。

本篇的主要功能点:
1、webView如何加载H5页面
2、Android如何调用H5中的方法
3、H5如何调用Android中的方法

1、webview如何加载H5页面
我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同:

//加载assets文件夹下的test.html页面,文件截图如图1mWebView.loadUrl("file:///android_asset/test.html");//加载网页mWebView.loadUrl("http://www.baidu.com");

 

图1:加载本地assets里的test.html文件截图
2、Android如何调用H5中的方法**
想要调用js方法那么就必须让webView支持

 

WebSettings webSettings = mWebView.getSettings();//设置为可调用js方法webSettings.setJavaScriptEnabled(true);

**
如何调用?
Android调用H5中的方法,其实很简单,直接调用就可以了,不需要额外的操作。
①调用H5中无参无返回值的方法***
直接可以调用mWebView.loadUrl("JavaScript:show()");图2为H5中show()方法。*

mWebView.loadUrl("JavaScript:show()");

图2:android 调用H5中无参数无返回值的方法,截图为H5中的方法

**
②调用H5中带返回值的方法***
可以调用mWebView.evaluateJavascript()方法,该方法只在安卓4.4以上版本适用,图3为Android调用H5中带返回值的方法。

mWebView.evaluateJavascript("sum(1,2)",new ValueCallback() {               @Override       public void on ReceiveValue(String value) {                       Log.e(TAG,"onReceiveValue value=" + value);              }   });

图3:安卓调用H5中带返回值的方法

**
③调用H5中带参数的方法***
当调用H5中带参数的方法时,势必要传入一个字符串,当传入固定字符串时,用单引号括起来即可;当传入变量名时,需要用到转义符(这里我也是花费半个小时才搞懂的,嘿嘿)。两种情况代码,分别在下面贴出,应用截图如图4。

mWebView.loadUrl("javascript:alertMessage('哈哈')");
*String  content="9880";*mWebView.loadUrl(  "javascript:alertMessage(\" "     +content+     "\")"      );

图4:Android调用H5中带参数的方法

3、H5如何调用android中的方法
*** *H5调用Android里的方法,相对复杂一些,双方具体操作如下:

*** Android需要做什么呢?????***
说白了就是新建一个类,里面写提供给H5操作的方法,并规定别名。这里我新建的class为JsInteration,方法为back(),规定的别名为android。先贴截图,后贴代码。*

 

图4:H5调用Android里的方法,Android需要的操作


在安卓4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法

public  class  JsInteration  {      @JavascriptInterface      public  String  back() {             return "hello world";          }}

定义完这个方法后再调用mWebView.addJavascriptInterface()方法:

mWebView.addJavascriptInterface(newJsInteration(),"android");

在H5中怎么来调用呢?
调用格式为 window.别名.android中的方法名(parameter Values) ,此示例中我们用的别名为android,方法名为back()。先截图,后贴代码。

图4:H5调用Android里的方法,Android需要的操作
**  H5代码如下:***

function s() {      var result=window.android.back();      document.getElementById("p").innerHTML=result;}

以上就是Android调用H5方法以及H5调用Android方法的实现交互方式中的一种。下面给出完整代码:
**
MainActivity代码:***

package com.e_valmont.javaandjsinteractivedemo;import android.annotation.SuppressLint;import android.annotation.TargetApi;import android.os.Build;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.webkit.JavascriptInterface;import android.webkit.ValueCallback;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;public class MainActivity extends AppCompatActivity{    private static final String TAG = "MainActivity";    private WebView mWebView;    @SuppressLint("JavascriptInterface")    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mWebView = (WebView) findViewById(R.id.webview);        mWebView.loadUrl("file:///android_asset/js_java_interaction.html");//加载本地asset下面的js_java_interaction.html文件        //mWebView.loadUrl("https://www.baidu.com/");//加载本地assets下面的js_java_interaction.html文件        WebSettings webSettings = mWebView.getSettings();        webSettings.setJavaScriptEnabled(true);//打开js支持        /**         * 打开js接口給H5调用,参数1为本地类名,参数2为别名;h5用window.别名.类名里的方法名才能调用方法里面的内容,例如:window.android.back();         * */        mWebView.addJavascriptInterface(new JsInteration(), "android");        mWebView.setWebViewClient(new WebViewClient());        mWebView.setWebChromeClient(new WebChromeClient());    }    /**     * 自己写一个类,里面是提供给H5访问的方法     * */    public class JsInteration {        @JavascriptInterface//一定要写,不然H5调不到这个方法        public String back() {            return "我是java里的方法返回值";        }    }    //点击按钮,访问H5里带返回值的方法    @TargetApi(Build.VERSION_CODES.KITKAT)    public void onClick(View v) {        Log.e("TAG", "onClick: ");//        mWebView.loadUrl("JavaScript:show()");//直接访问H5里不带返回值的方法,show()为H5里的方法        //传固定字符串可以直接用单引号括起来        mWebView.loadUrl("javascript:alertMessage('哈哈')");//访问H5里带参数的方法,alertMessage(message)为H5里的方法        //当出入变量名时,需要用转义符隔开        String content="9880";        mWebView.loadUrl("javascript:alertMessage(\""   +content+   "\")"   );        //Android调用有返回值js方法,安卓4.4以上才能用这个方法        mWebView.evaluateJavascript("sum(1,2)", new ValueCallback() {            @Override            public void onReceiveValue(String value) {                Log.d(TAG, "js返回的结果为=" + value);                Toast.makeText(MainActivity.this,"js返回的结果为=" + value,Toast.LENGTH_LONG).show();            }        });    }}

activiy_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>        

js_java_interaction.html代码:

                                                    这是html页面 
点击跳转到原生页面

**
注意事项:***
1、当自己写html文件时,可能会出现显示乱码,我们需要指定格式

 

截图为Html显示乱码,需要执行的操作

 

2、当H5调用我们的方法时,我们需要把规定的别名传给H5(切记一定不能错),而且我们要在自己的方法里执行H5想要的操作。

 

截图中的别名是需要我们传给H5的


3、给H5调用的方法一定要加@JavascriptInterface,不然H5调不到我们的方法

@JavascriptInterface一定要加


4、 调用js有参数有返回值的函数时,只有安卓4.4以上才能用webView.evaluateJavascript方法直接拿到返回值;当版本低于4.4的时候,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。

①.Java调用js代码

String call = "javascript:sumToJava(1,2)";webView.loadUrl(call);

②.js函数处理,并将结果通过调用java方法返回

function sumToJava(number1, number2){       window.control.onSumResult(number1 + number2)}

③.Java在回调方法中获取js函数返回值

@JavascriptInterfacepublic void onSumResult(int result) {  Log.i(LOGTAG, "onSumResult result=" + result);}

5、加载本地assets里的H5界面,要写成android_asset,而不是assets,不然加载不到

 

注意格式


参考文章:Android和H5之间的交互
webView和h5交互** 在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的JavaScript进行交互,Android也对交互做了很好的封装,所以很容易实现例如:点击网页中的按钮Android调用原生对话框,点击网页中的电话号码调用Android拨号APP。这篇给大家介绍下如何实现Android与HTML+JS的交互。

 

本篇的主要功能点:
1、webView如何加载H5页面
2、Android如何调用H5中的方法
3、H5如何调用Android中的方法

1、webview如何加载H5页面
我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同:

//加载assets文件夹下的test.html页面,文件截图如图1mWebView.loadUrl("file:///android_asset/test.html");//加载网页mWebView.loadUrl("http://www.baidu.com");

 

图1:加载本地assets里的test.html文件截图
2、Android如何调用H5中的方法**
想要调用js方法那么就必须让webView支持

 

WebSettings webSettings = mWebView.getSettings();//设置为可调用js方法webSettings.setJavaScriptEnabled(true);

**
如何调用?
Android调用H5中的方法,其实很简单,直接调用就可以了,不需要额外的操作。
①调用H5中无参无返回值的方法***
直接可以调用mWebView.loadUrl("JavaScript:show()");图2为H5中show()方法。*

mWebView.loadUrl("JavaScript:show()");

图2:android 调用H5中无参数无返回值的方法,截图为H5中的方法

**
②调用H5中带返回值的方法***
可以调用mWebView.evaluateJavascript()方法,该方法只在安卓4.4以上版本适用,图3为Android调用H5中带返回值的方法。

mWebView.evaluateJavascript("sum(1,2)",new ValueCallback() {               @Override       public void on ReceiveValue(String value) {                       Log.e(TAG,"onReceiveValue value=" + value);              }    });

图3:安卓调用H5中带返回值的方法

**
③调用H5中带参数的方法***
当调用H5中带参数的方法时,势必要传入一个字符串,当传入固定字符串时,用单引号括起来即可;当传入变量名时,需要用到转义符(这里我也是花费半个小时才搞懂的,嘿嘿)。两种情况代码,分别在下面贴出,应用截图如图4。

mWebView.loadUrl("javascript:alertMessage('哈哈')");
String  content="9880";mWebView.loadUrl(  "javascript:alertMessage(\" "     +content+     "\")"      );

图4:Android调用H5中带参数的方法

3、H5如何调用android中的方法
*** *H5调用Android里的方法,相对复杂一些,双方具体操作如下:

*** Android需要做什么呢?????***
说白了就是新建一个类,里面写提供给H5操作的方法,并规定别名。这里我新建的class为JsInteration,方法为back(),规定的别名为android。先贴截图,后贴代码。*

 

图4:H5调用Android里的方法,Android需要的操作


在安卓4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法

public  class  JsInteration  {      @JavascriptInterface      public  String  back() {             return "hello world";          }}

定义完这个方法后再调用mWebView.addJavascriptInterface()方法:

mWebView.addJavascriptInterface(newJsInteration(),"android");

在H5中怎么来调用呢?
调用格式为 window.别名.android中的方法名(parameter Values) ,此示例中我们用的别名为android,方法名为back()。先截图,后贴代码。

图4:H5调用Android里的方法,Android需要的操作
**  H5代码如下:***

function s() {      var result=window.android.back();      document.getElementById("p").innerHTML=result;}

以上就是Android调用H5方法以及H5调用Android方法的实现交互方式中的一种。下面给出完整代码:
**
MainActivity代码:***

package com.e_valmont.javaandjsinteractivedemo;import android.annotation.SuppressLint;import android.annotation.TargetApi;import android.os.Build;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.webkit.JavascriptInterface;import android.webkit.ValueCallback;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;public class MainActivity extends AppCompatActivity{    private static final String TAG = "MainActivity";    private WebView mWebView;    @SuppressLint("JavascriptInterface")    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mWebView = (WebView) findViewById(R.id.webview);        mWebView.loadUrl("file:///android_asset/js_java_interaction.html");//加载本地asset下面的js_java_interaction.html文件        //mWebView.loadUrl("https://www.baidu.com/");//加载本地assets下面的js_java_interaction.html文件        WebSettings webSettings = mWebView.getSettings();        webSettings.setJavaScriptEnabled(true);//打开js支持        /**         * 打开js接口給H5调用,参数1为本地类名,参数2为别名;h5用window.别名.类名里的方法名才能调用方法里面的内容,例如:window.android.back();         * */        mWebView.addJavascriptInterface(new JsInteration(), "android");        mWebView.setWebViewClient(new WebViewClient());        mWebView.setWebChromeClient(new WebChromeClient());    }    /**     * 自己写一个类,里面是提供给H5访问的方法     * */    public class JsInteration {        @JavascriptInterface//一定要写,不然H5调不到这个方法        public String back() {            return "我是java里的方法返回值";        }    }    //点击按钮,访问H5里带返回值的方法    @TargetApi(Build.VERSION_CODES.KITKAT)    public void onClick(View v) {        Log.e("TAG", "onClick: ");//        mWebView.loadUrl("JavaScript:show()");//直接访问H5里不带返回值的方法,show()为H5里的方法        //传固定字符串可以直接用单引号括起来        mWebView.loadUrl("javascript:alertMessage('哈哈')");//访问H5里带参数的方法,alertMessage(message)为H5里的方法        //当出入变量名时,需要用转义符隔开        String content="9880";        mWebView.loadUrl("javascript:alertMessage(\""   +content+   "\")"   );        //Android调用有返回值js方法,安卓4.4以上才能用这个方法        mWebView.evaluateJavascript("sum(1,2)", new ValueCallback() {            @Override            public void onReceiveValue(String value) {                Log.d(TAG, "js返回的结果为=" + value);                Toast.makeText(MainActivity.this,"js返回的结果为=" + value,Toast.LENGTH_LONG).show();            }        });    }}

activiy_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>        

js_java_interaction.html代码:

                                                    这是html页面 
点击跳转到原生页面

**  注意事项:***
1、当自己写html文件时,可能会出现显示乱码,我们需要指定格式

截图为Html显示乱码,需要执行的操作

2、当H5调用我们的方法时,我们需要把规定的别名传给H5(切记一定不能错),而且我们要在自己的方法里执行H5想要的操作。

截图中的别名是需要我们传给H5的


3、给H5调用的方法一定要加@JavascriptInterface,不然H5调不到我们的方法

@JavascriptInterface一定要加


4、 调用js有参数有返回值的函数时,只有安卓4.4以上才能用webView.evaluateJavascript方法直接拿到返回值;当版本低于4.4的时候,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。

①.Java调用js代码

String call = "javascript:sumToJava(1,2)";webView.loadUrl(call);

②.js函数处理,并将结果通过调用java方法返回

function sumToJava(number1, number2){       window.control.onSumResult(number1 + number2)}

③.Java在回调方法中获取js函数返回值

@JavascriptInterfacepublic void onSumResult(int result) {  Log.i(LOGTAG, "onSumResult result=" + result);}

5、加载本地assets里的H5界面,要写成android_asset,而不是assets,不然加载不到

 

注意格式


作者:@这是一个秘密
链接:https://blog.csdn.net/qq_36467463/article/details/78500161

更多相关文章

  1. Android动态加载外部jar包及jar包中图片等资源文件
  2. Android Alarm驱动源代码分析(Alarm.c)
  3. Android动态加载jar/dex
  4. Android百度地图之位置定位和附近查找代码简单实现 (上)
  5. Android中WebView加载本地Html,与JavaScript与Android方法相互传
  6. [Android]设置Activity为全屏显示的两种方法
  7. Android Studio中配置代码和资源的路径

随机推荐

  1. android UI 小知识点
  2. Android 4.0设计规范 优先导读 十大改变
  3. Android之判断当前指定App是否在前台
  4. ProgressBar进度条
  5. minSdkVersion、targetSdkVersion、targe
  6. Android 5.0 API 的变化——开发人员注意
  7. Android编译报错
  8. Android电话拨号器实现方法
  9. 在非主线程中不能操作主线程中的View
  10. Android 泛型使用