android 和h5交互,Android中与H5的交互
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的交互相关推荐
- Android使用Chrome调试webview中的H5界面
前言:我们的项目是使用的webview加载H5的应用类型,最近框架升级后项目出现问题.通过chrome进行调试,发现每次都忘记使用步骤.今天记录一下! 下面是调试步骤: 1.电脑下载的Chrom浏览器 ...
- android h5 书,android与H5交互
1 - WebView基本配置 2 -WebView和H5的交互 3 - WebView错误页面处理 4 -WebView中的Cookie操作 5 -WebView漏洞 6 -WebView内存泄漏问 ...
- 混合开发中,H5页面如何监听Android手机返回键
1. 前言 混合开发中,如果当前操作的页面是H5写的.那么这个时候点击Android手机返回键,默认是返回到上一个页面,跟浏览器的回退功能是一样的,都是返回到历史记录中的前一个记录.看着好像没啥问题, ...
- 交互设计师必须知道的五大交互设计流程
交互设计师必须知道的五大交互设计流程 交互设计又称互动设计,从用户角度来说,交互设计是一种如何让产品易用,有效而让人愉悦的技术,它致力于了解目标用户和他们的期望,了解用户在同产品交互时彼此的行为,了解 ...
- 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 开发文档的链接 首先官方文档这 ...
- 将uni-app打包的H5放在 Android程序中在 webview 显示的两种方法
将uni-app打包的H5放在 Android程序中在 webview 显示的两种方法 前言 Hash History 完事 前言 之前有个项目要同时做小程序和APP,本着节省时间的想法,研究了下un ...
- 本地H5植入Android 9.0的js交互以及H5无法请求到网络的和解决
之前写了H5,新建assets目录,将文件拷贝导入 然后写个webviewactivity.class, package practice.lwp.app_gz_zy_sjtl;import andr ...
- java与js交互视频_Android与H5交互—Java调用Js、Js调Java、H5页面调用Android播放视频...
content="ANZO,GAME,LOL,DNF,DOTA,撸啊撸,地下城与勇士,掌游宝,攻略,宝典,模拟器,加点,战报,英雄,最新,最全,最强,视频"> content ...
- android h5 有广告,那些H5在Android上显示的丧心病狂的坑
首先得强调一下,H5和移动设备的交互遇到的问题真的是各种丧心病狂!!但是本主依然还是耐着极大的兴致(无奈)的做了下去. H5页面在Android或者IOS上运行出现问题(这里的运行指的是h5的页面运行 ...
最新文章
- spring21:Aspectj实现后置通知@AfterReturning
- Java基础篇:强制类型转换
- Matlab各种最值问题
- python之工作举例:通过复制NC文件来造数据
- python61到08使用说明书_python 08 文件操作
- Mysql如何新建一个服务和移除所新建的服务
- 视频时帧率达到15,人眼就感觉是连续的
- M5311连接HTTPS服务器下载bin文件(干货)
- ZOJ 3527 Shinryaku! Kero Musume 【树形DP[带简单环]】
- 用k-mer分析进行基因组调查:(二)用jellyfish进行k-mer频数统计
- BacNet IP开发过程
- spring mvc
- 红外对管信号处理电路(滞回比较器)
- 项目经理OA选型 Teambition、Worktile、iQuicker、Tower
- 版本管理·玩转git(团队合作)
- 微信小程序中的空格怎么打
- ffmpeg 4.2.1 版本升级日志 APIChanges
- 【学习资料】中国开放大学-电大-《教育学》形考作业答案(2018).docx
- 前端 重定向和转发
- 辗转相除求最大公约数原理
热门文章
- java小编程---生成不重复的随机数列
- leetcode 442. Find All Duplicates in an Array | 442. 数组中重复的数据(位运算)
- leetcode 303. Range Sum Query - Immutable | 303. 区域和检索 - 数组不可变(一维前缀和问题)
- 【Java小游戏】小球躲避游戏 图片轮播爆炸效果、边缘反弹、计时功能
- URL URI傻傻分不清楚,dart告诉你该怎么用
- 密码学系列之:Merkle–Damgård结构和长度延展攻击
- Netty之Channel的继承关系
- 如何配置webpack的loader
- CSS3属性之resize
- (干货满满!)session和cookie作用原理,区别(史上最详细)