Android WebView与JS交互全面详解(小结)

下面我来为你详细讲解“Android WebView与JS交互全面详解(小结)”的完整攻略。

了解Android WebView和JS交互的基本概念

在开始介绍Android WebView与JS交互的具体内容前,我们需要先了解一些基础概念:

  • WebView:Android中的一个内置控件,提供了一个用于显示web界面的View。WebView可以加载网页上的HTML、CSS、JavaScript脚本等内容。
  • JavaScript:一种脚本语言,最初被设计用于网页的交互和动态变化。JS可以通过在网页中内联代码或链接外部文件的方式被引入到网页中。
  • JS Bridge:指在WebView中,实现Java和JavaScript交互的桥梁。

Android WebView与JS交互的方法

实现Android WebView与JS交互的方法大致可分为以下四种:

  1. 通过WebView.loadUrl()方法实现

该方法适合于Java调用JS代码。Java代码可以通过WebView的loadUrl方法来向JS中注入JavaScript代码或者调用JS中的JavaScript函数。具体实现步骤如下:

  • 调用WebView的loadUrl()方法,将JS中的JavaScript代码或者JavaScript函数注入到WebView中,这样JS就可以访问该代码或函数。例如:
webView.loadUrl("javascript:document.getElementById('xxx').innerHTML='xxx'");
  • 在JS中编写JavaScript代码或给JavaScript函数取一个名字,调用Java中的方法,例如:
// JS代码
function jsFunction() {
  window.androidFunction.showMsg();
}

// Java代码
WebView webView = findViewById(R.id.webView);
webView.addJavascriptInterface(new JsInterface(),"androidFunction");

class JsInterface {
    @JavascriptInterface
    public void showMsg() {
        Toast.makeText(MainActivity.this, "JS调用了Java的方法", Toast.LENGTH_LONG).show();
    }
}
  1. 通过WebView.evaluateJavascript()方法实现

该方法适合于Java调用JS代码并获取返回值。Java代码可以通过WebView的evaluateJavascript()方法来调用JS中的JavaScript函数,并获取返回值。具体实现步骤如下:

  • 在JS中编写需要被Java调用的JavaScript代码或函数并给其取一个名字,例如:
// JS代码
function jsFunction(s) {
  return "返回值为:" + s;
}
  • 在Java中调用evaluateJavascript()方法并传入JavaScript函数名和需要传递的参数,此时可以设置一个回调函数,来获取JS函数返回值。例如:
webView.evaluateJavascript("jsFunction('参数值')", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Toast.makeText(MainActivity.this, value, Toast.LENGTH_LONG).show();
            }
        });
  1. 通过添加JS Interface实现

该方法适用于JS调用Java方法。Java代码可以使用addJavascriptInterface()方法将一个Java对象暴露给JS使用,此时JS可以通过该Java对象来调用Java方法。具体实现步骤如下:

  • 在Java中,创建一个对象并注解@JavascriptInterface,例如:
class JsInterface {
    @JavascriptInterface
    public void showToast(String msg) {
        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
    }
}
  • 在WebView中添加JS Interface,例如:
webView.addJavascriptInterface(new JsInterface(), "android");
  • 在JS中使用JavaScript调用该Java对象的方法,例如:
<script type="text/javascript">
    function showToast() {
        window.android.showToast("Javascript调用了Java方法");
    }
</script>
  1. 通过 WebViewClient 的方法实现

该方法适用于捕获JS调用Java的方法。当JS需要调用Java中的方法时,WebView会调用一个shouldOverrideUrlLoading()方法,此时可以通过该方法捕获JS调用的URL并做出相应的处理。具体实现步骤如下:

  • 在JS中,调用某个特定的URL,并添加一些特定的参数,例如:
function JsToJava() {
   var url= "myApp://actionName?params1"+params1+"&params2="+params2;
   location.href=url;         
}
  • shouldOverrideUrlLoading()方法中,解析URL并调用Java方法,例如:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
   Uri uri=Uri.parse(url);
   if (uri.getScheme().equals("myApp")) {
      if (uri.getHost().equals("actionName")) {
          String params1 = uri.getQueryParameter("params1");
          String params2 = uri.getQueryParameter("params2");
          Toast.makeText(WebviewActivity.this, "JS调用了Java方法:" + params1, Toast.LENGTH_LONG).show();
      }
      return true;
   }
   return super.shouldOverrideUrlLoading(view, url);
}

示例说明

下面给出两个示例说明:

示例一

在JS中调用Java方法,并返回结果。具体实现步骤如下:

<!--在HTML中编写调用Java的JS代码-->
<button onclick="getAndroidVersion()">获取Android系统版本号</button>
<script type="text/javascript">
function getAndroidVersion() {
    var version = window.android.getAndroidVersion();
    alert(version);
}
</script>

// 在MainActivity中调用evaluateJavascript方法
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        //JS代码执行完成后,调用JS中的方法获取Android系统版本号
        webView.evaluateJavascript("javascript:getAndroidVersion()", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Toast.makeText(MainActivity.this, value, Toast.LENGTH_LONG).show();
            }
        });
    }
});
webView.loadUrl("file:///android_asset/index.html");

// 在JsInterface中添加getAndroidVersion方法
@JavascriptInterface
public String getAndroidVersion() {
    return Build.VERSION.RELEASE;
}

示例二

在Java中调用JS代码。具体实现步骤如下:

// 在MainActivity中调用loadUrl方法
webView.loadUrl("javascript:document.getElementById('xxx').innerHTML='Hello World!'");

// 在JS中编写需要被调用的函数
function jsFunction() {
    window.androidFunction.showMsg();
}

// 在JsInterface中添加showMsg方法
@JavascriptInterface
public void showMsg() {
    Toast.makeText(MainActivity.this, "JS调用了Java方法", Toast.LENGTH_LONG).show();
}

以上就是Android WebView与JS交互的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android WebView与JS交互全面详解(小结) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 魔鬼字典 JavaScript 笔记 代码比较多乱第3/3页

    下面是详细讲解“魔鬼字典 JavaScript 笔记 代码比较多乱第3/3页”的完整攻略。 1. 了解魔鬼字典的功能 魔鬼字典是一个基于 JavaScript 实现的词典工具,可以帮助用户查询单词的翻译、同义词、反义词和例句等信息。该工具的主要功能包括: 解析用户输入的单词,并根据单词的不同词性展示不同的内容。 可以查询单词的翻译、同义词、反义词和例句等信息…

    JavaScript 2023年5月19日
    00
  • jQuery加密密码到cookie的实现代码

    要实现将加密密码存储到cookie的过程,需要进行以下步骤: 1. 引入jQuery插件 提供加密解密功能的jQuery插件有很多种,这里选择一个比较常用的插件:jquery.cookie。此插件可以方便地创建、读取和删除cookie。 <head> <script src="https://code.jquery.com/jqu…

    JavaScript 2023年6月11日
    00
  • JS判断元素是否在数组内的实现代码

    判断一个元素是否在一个数组内,是在JS编程中非常常见的问题,一般通过indexOf()函数、includes()函数、for循环等方式实现。 indexOf()函数实现 indexOf() 函数返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。我们可以利用这一特点来实现判断元素是否在数组内。 const arr = [1, 2, 3, 4…

    JavaScript 2023年5月27日
    00
  • Ajax异步提交表单数据的说明及方法实例

    当使用传统的表单提交方式时,用户提交表单后会跳转到其他页面并加载新的页面内容,这样用户体验较差。而使用Ajax异步提交表单,可以在不刷新页面的情况下提交表单数据,提升用户体验。 实现Ajax异步提交表单数据的步骤如下: 绑定表单的提交事件,阻止默认的表单提交行为。可以使用jQuery的submit方法: $( "#myForm" ).su…

    JavaScript 2023年6月11日
    00
  • Javascript点击其他任意地方隐藏关闭DIV实例

    好的。您想实现的效果是当用户在页面上点击除某个指定的div以外的其它任何地方时,可以将该指定的div隐藏起来。实现这个功能可以使用JavaScript。 下面是实现该功能的完整攻略: 1.在HTML中添加div元素 首先,在HTML文档中添加包含需要隐藏的内容的div元素。例如,下面的代码创建一个div元素: <div id="myDiv&q…

    JavaScript 2023年6月11日
    00
  • JavaScript 数组遍历的五种方法

    JavaScript 数组遍历的五种方法如下: 1. forEach() array.forEach(function(currentValue, index, arr), thisValue) forEach() 方法用于调用数组中的每个元素,并将元素传递给回调函数。该方法不会返回新的数组,而是在原始数组中执行回调函数。回调函数可以接收三个参数:当前元素的…

    JavaScript 2023年5月27日
    00
  • js实现旋转大风车

    下面是“JS实现旋转大风车”的完整攻略。 步骤一:HTML结构 首先,我们需要在HTML中编写一个容器div和两个风车翅膀的图片。具体代码如下: <div id="windmill"> <img class="blade" src="blade.png"> <img c…

    JavaScript 2023年6月11日
    00
  • 简介JavaScript中POSITIVE_INFINITY值的使用

    简介JavaScript中POSITIVE_INFINITY值的使用 在 JavaScript 中,POSITIVE_INFINITY是一个特殊的数值,表示正无穷大。它通常表示一个计算无限的结果或者是一个超过数值范围的值。在下面的内容中,我们将深入了解 POSITIVE_INFINITY 值的使用。 使用场景 除法中出现分母为零 当我们向一个数除以0时,将出…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部