IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android与H5(JS)互调 -> 正文阅读

[移动开发]Android与H5(JS)互调

1、Android调用H5(JS)

1.1、新建assets资源目录并将准备好的HTML页面放入其中

(真实项目中HTML页面放在Tomcat中启动)

1.2、初始化webView并加载HTML页面

    @SuppressLint({"SetJavaScriptEnabled", "AddJavascriptInterface"})
    public void initWebView() {
        //可以加载网页和自定义浏览器
        webView = new WebView(this);

        //设置支持JS
        webView.getSettings().setJavaScriptEnabled(true);

        //设置不调用系统浏览器,使用自定义浏览器
        webView.setWebViewClient(new WebViewClient());

        //加载网络或本地网页
//        webView.loadUrl("https://www.bilibili.com/video/BV1SW411L7qM?p=3");
        webView.loadUrl("file:///android_asset/JavaAndJsCallActivity.html");

        //TODO 1、先初始化webView,此处先不要加载webView
//        setContentView(webView);
    }

1.3、调用HTML中的JS代码

        webView.post(new Runnable() {
            @Override
            public void run() {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    //调用JS中的javaCallJs方法
                    webView.evaluateJavascript("javascript:javaCallJs(" + " ' "+ name + " ' " + ")", new ValueCallback<String>() {
                        @Override
                        public void onReceiveValue(String s) {
                            //JS返回结果
                            Log.e("TAG", "onReceiveValue: " + s);
                        }
                    });
                } else {
                    webView.loadUrl("javascript:javaCallJs(" + " ' "+ name + " ' " + ")");
                }
            }
        });

        //TODO 2、调用完函数后再加载webView(否则会出现HTML中函数未定义的错误)
        setContentView(webView);

2、JS调用Android代码

2.1、 添加JavascriptInterface

//添加JavascriptInterface后JS可通过Android字段调用JavaAndJsCallInterface类中的任何方法
webView.addJavascriptInterface(new JavaAndJsCallInterface(), "Android");

2.2、编写JS要调用的Android类和Android方法

    /**
     * JS要调用的Java中的类.
     */
    class JavaAndJsCallInterface {

        //注意加注释
        @JavascriptInterface
        public void toast() {
            Toast.makeText(JavaAndJsCallActivity.this, "我是Android代码,我被调用了!", Toast.LENGTH_LONG).show();
        }

    }

3、完整代码如下

3.1、完整Activity代码

package com.android.h5;

import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

/**
 * Java与JS互调.
 */
public class JavaAndJsCallActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_java_and_js_call);

        initWebView();

        Button btnLogin = findViewById(R.id.btn_login);
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                login("android");
            }
        });

    }

    @SuppressLint({"SetJavaScriptEnabled", "AddJavascriptInterface"})
    public void initWebView() {
        //可以加载网页和自定义浏览器
        webView = new WebView(this);

        //设置支持JS
        webView.getSettings().setJavaScriptEnabled(true);

        //设置不调用系统浏览器,使用自定义浏览器
        webView.setWebViewClient(new WebViewClient());

        //加载网络或本地网页
//        webView.loadUrl("https://www.bilibili.com/video/BV1SW411L7qM?p=3");
        webView.loadUrl("file:///android_asset/JavaAndJsCallActivity.html");

        //添加JavascriptInterface后JS可通过Android字段调用JavaAndJsCallInterface类中的任何方法
        webView.addJavascriptInterface(new JavaAndJsCallInterface(), "Android");

        //TODO 1、先初始化webView,此处先不要加载webView
//        setContentView(webView);
    }

    private void login(final String name) {

        webView.post(new Runnable() {
            @Override
            public void run() {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    webView.evaluateJavascript("javascript:javaCallJs(" + " ' "+ name + " ' " + ")", new ValueCallback<String>() {
                        @Override
                        public void onReceiveValue(String s) {
                            //JS返回结果
                            Log.e("TAG", "onReceiveValue: " + s);
                        }
                    });
                } else {
                    webView.loadUrl("javascript:javaCallJs(" + " ' "+ name + " ' " + ")");
                }
            }
        });

        //TODO 2、调用完函数后再加载webView(否则会出现HTML中函数未定义的错误)
        setContentView(webView);
    }

    /**
     * JS要调用的Java中的类.
     */
    class JavaAndJsCallInterface {

        @JavascriptInterface
        public void toast() {
            Toast.makeText(JavaAndJsCallActivity.this, "我是Android代码,我被调用了!", Toast.LENGTH_LONG).show();
        }

    }
}

3.2、完整布局代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".JavaAndJsCallActivity">

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

3.3、完整HTML代码

<html lang="zh-CN">
<p id='p'>hello world</p>

<script>
        //JS中的函数
        function javaCallJs(arg){
            document.getElementById("p").innerHTML = " 你好!" + arg
        }
</script>

<!-- 调用Android中的toast函数 -->
<button onclick="Android.toast()">点击Android被调用</button>

</html>

?

?

?

?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:53:47  更:2022-05-01 15:54:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 23:30:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码