Android日常开发中,常常会遇到加载H5页面的情况,于是少不了与H5页面的交互问题。具体表现在Android调用H5代码及H5中调用Android代码两种情况。

测试页面

test.png

这里我们首先编写上图所示的测试页面,在MainActivity中初始化各组件

private void initView() {

mLoginLayout = findViewById(R.id.login_layout);

mUserName = findViewById(R.id.edit_user_name);

mPassword = findViewById(R.id.edit_password);

mWebView = findViewById(R.id.web_view);

}

Android调用H5

要点:

WebView.loadUrl("javascript:method(" + "'" + param+ "'" + ")");

Android调用H5时,首先创建WebView页面,初始化完成后,调用loadUrl方法,其参数有固定格式,以“javascript:”开头,表示调用javasript代码,后面接在H5中自己定义的method方法,如有参数须像上面那样前后再用单引号括起来。

初始化WebView

private void initWebView() {

WebSettings settings = mWebView.getSettings();

// 设置启用JavaScript功能

settings.setJavaScriptEnabled(true);

mWebView.setWebViewClient(new WebViewClient());

mWebView.loadUrl("file:///android_asset/index.html");

}

将已经写好的index.html文件放在assets目录下,通过loadUrl方法加载进来。

点击登录跳转到H5页面,并在H5页面中显示输入的用户名。

public void login(View view) {

String userName = mUserName.getText().toString().trim();

String password = mPassword.getText().toString().trim();

login(userName, password);

}

private void login(String userName, String password) {

if(!TextUtils.isEmpty(password) && TextUtils.equals("123456", password)) {

mWebView.loadUrl("javascript:login(" + "'" + userName + "'" + ")");

mWebView.setVisibility(View.VISIBLE);

mLoginLayout.setVisibility(View.GONE);

} else {

Toast.makeText(this, "密码输出错误", Toast.LENGTH_SHORT).show();

}

}

效果如下:

H5.png

H5调用Android

要点:

Android中:WebView调用addaddJavascriptInterface方法,JsInterface为H5回调类,自定义名称,tag与H5中js代码window后的tag名称一致即可。JsInterface中回到方法method()记得添加@JavascriptInterface标记。

WebView.addJavascriptInterface(new JsInterface(), tag);

private class JsInterface {

@JavascriptInterface

public void method() {

}

}

H5中:onclick()方法中使用window开头,表示调用Android方法,tag与前面保持一致,method为Android中的回调方法,可传参。

退出登录

完整代码

MainActivity:

public class MainActivity extends AppCompatActivity {

private View mLoginLayout;

private TextView mUserName;

private TextView mPassword;

private WebView mWebView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

initWebView();

}

private void initView() {

mLoginLayout = findViewById(R.id.login_layout);

mUserName = findViewById(R.id.edit_user_name);

mPassword = findViewById(R.id.edit_password);

mWebView = findViewById(R.id.web_view);

}

private void initWebView() {

WebSettings settings = mWebView.getSettings();

// 设置启用JavaScript功能

settings.setJavaScriptEnabled(true);

mWebView.setWebViewClient(new WebViewClient());

mWebView.addJavascriptInterface(new JsLogoutInterface(), "android");

mWebView.loadUrl("file:///android_asset/index.html");

}

public void login(View view) {

String userName = mUserName.getText().toString().trim();

String password = mPassword.getText().toString().trim();

login(userName, password);

}

private void login(String userName, String password) {

if(!TextUtils.isEmpty(password) && TextUtils.equals("123456", password)) {

mWebView.loadUrl("javascript:login(" + "'" + userName + "'" + ")");

mWebView.setVisibility(View.VISIBLE);

mLoginLayout.setVisibility(View.GONE);

} else {

Toast.makeText(this, "密码输出错误", Toast.LENGTH_SHORT).show();

}

}

private class JsLogoutInterface {

@JavascriptInterface

public void logout() {

Toast.makeText(MainActivity.this, "退出成功", Toast.LENGTH_SHORT).show();

runOnUiThread(new Runnable() {

@Override

public void run() {

mWebView.setVisibility(View.GONE);

mLoginLayout.setVisibility(View.VISIBLE);

}

});

}

}

}

布局文件activity_main.xml:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

tools:context=".MainActivity">

android:id="@+id/login_layout"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:id="@+id/user_name"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="15dp"

android:text="用户名:"

android:textSize="16sp"

android:textColor="@android:color/black"

/>

android:id="@+id/edit_user_name"

android:layout_width="80dp"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/user_name"

android:layout_toRightOf="@+id/user_name"

android:layout_marginBottom="-8dp"

/>

android:id="@+id/password"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignRight="@+id/user_name"

android:layout_below="@+id/user_name"

android:layout_marginTop="15dp"

android:text="密码:"

android:textSize="16sp"

android:textColor="@android:color/black"

/>

android:id="@+id/edit_password"

android:layout_width="80dp"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/password"

android:layout_toRightOf="@+id/password"

android:layout_marginBottom="-8dp"

/>

android:id="@+id/login_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/password"

android:layout_marginTop="20dp"

android:layout_marginLeft="30dp"

android:text="登录"

android:onClick="login"

/>

android:id="@+id/web_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:visibility="gone"

/>

index.html:

Home

#user {

font-size: 20px;

color: red

}

function login(userName) {

document.getElementById("user").innerHTML = userName;

}

当前用户为:

退出登录

android 和h5交互,Android中与H5的交互相关推荐

  1. Android使用Chrome调试webview中的H5界面

    前言:我们的项目是使用的webview加载H5的应用类型,最近框架升级后项目出现问题.通过chrome进行调试,发现每次都忘记使用步骤.今天记录一下! 下面是调试步骤: 1.电脑下载的Chrom浏览器 ...

  2. android h5 书,android与H5交互

    1 - WebView基本配置 2 -WebView和H5的交互 3 - WebView错误页面处理 4 -WebView中的Cookie操作 5 -WebView漏洞 6 -WebView内存泄漏问 ...

  3. 混合开发中,H5页面如何监听Android手机返回键

    1. 前言 混合开发中,如果当前操作的页面是H5写的.那么这个时候点击Android手机返回键,默认是返回到上一个页面,跟浏览器的回退功能是一样的,都是返回到历史记录中的前一个记录.看着好像没啥问题, ...

  4. 交互设计师必须知道的五大交互设计流程

    交互设计师必须知道的五大交互设计流程 交互设计又称互动设计,从用户角度来说,交互设计是一种如何让产品易用,有效而让人愉悦的技术,它致力于了解目标用户和他们的期望,了解用户在同产品交互时彼此的行为,了解 ...

  5. dcloud html5 sdk,DCloud H5与Android Native的交互--5+ SDK插件开发

    DCloud 5+ SDK插件开发 http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/66 开发文档的链接 首先官方文档这 ...

  6. 将uni-app打包的H5放在 Android程序中在 webview 显示的两种方法

    将uni-app打包的H5放在 Android程序中在 webview 显示的两种方法 前言 Hash History 完事 前言 之前有个项目要同时做小程序和APP,本着节省时间的想法,研究了下un ...

  7. 本地H5植入Android 9.0的js交互以及H5无法请求到网络的和解决

    之前写了H5,新建assets目录,将文件拷贝导入 然后写个webviewactivity.class, package practice.lwp.app_gz_zy_sjtl;import andr ...

  8. java与js交互视频_Android与H5交互—Java调用Js、Js调Java、H5页面调用Android播放视频...

    content="ANZO,GAME,LOL,DNF,DOTA,撸啊撸,地下城与勇士,掌游宝,攻略,宝典,模拟器,加点,战报,英雄,最新,最全,最强,视频"> content ...

  9. android h5 有广告,那些H5在Android上显示的丧心病狂的坑

    首先得强调一下,H5和移动设备的交互遇到的问题真的是各种丧心病狂!!但是本主依然还是耐着极大的兴致(无奈)的做了下去. H5页面在Android或者IOS上运行出现问题(这里的运行指的是h5的页面运行 ...

最新文章

  1. spring21:Aspectj实现后置通知@AfterReturning
  2. Java基础篇:强制类型转换
  3. Matlab各种最值问题
  4. python之工作举例:通过复制NC文件来造数据
  5. python61到08使用说明书_python 08 文件操作
  6. Mysql如何新建一个服务和移除所新建的服务
  7. 视频时帧率达到15,人眼就感觉是连续的
  8. M5311连接HTTPS服务器下载bin文件(干货)
  9. ZOJ 3527 Shinryaku! Kero Musume 【树形DP[带简单环]】
  10. 用k-mer分析进行基因组调查:(二)用jellyfish进行k-mer频数统计
  11. BacNet IP开发过程
  12. spring mvc
  13. 红外对管信号处理电路(滞回比较器)
  14. 项目经理OA选型 Teambition、Worktile、iQuicker、Tower
  15. 版本管理·玩转git(团队合作)
  16. 微信小程序中的空格怎么打
  17. ffmpeg 4.2.1 版本升级日志 APIChanges
  18. 【学习资料】中国开放大学-电大-《教育学》形考作业答案(2018).docx
  19. 前端 重定向和转发
  20. 辗转相除求最大公约数原理

热门文章

  1. java小编程---生成不重复的随机数列
  2. leetcode 442. Find All Duplicates in an Array | 442. 数组中重复的数据(位运算)
  3. leetcode 303. Range Sum Query - Immutable | 303. 区域和检索 - 数组不可变(一维前缀和问题)
  4. 【Java小游戏】小球躲避游戏 图片轮播爆炸效果、边缘反弹、计时功能
  5. URL URI傻傻分不清楚,dart告诉你该怎么用
  6. 密码学系列之:Merkle–Damgård结构和长度延展攻击
  7. Netty之Channel的继承关系
  8. 如何配置webpack的loader
  9. CSS3属性之resize
  10. (干货满满!)session和cookie作用原理,区别(史上最详细)