WebView之javascript与android交互基础加强
一、什么是js与android交互?
通俗一点就是使用js代码调用java代码,或者使用java代码调用js代码。
二、为什么要使用js与java代码交互?
1.可以做一些js网页做本身处理不了的事情。例如:在网页上调用Android本地打电话,发短信功能、在网页上调用Android手机通讯录、在网页上调用第三方应用、在网页上调用一些Android的本地化处理(操作IO,数据库)等。
2.可以实现js开发人员与android开发人员合作开发。例如:js开发人员开发js代码供android开发人员调用,android开发人员就不必写js代码,可以专注于andrid开发,用到js的时候直接调用js代码就可以了。(反之亦然)
3.可以实现网页的动态更新。例如:可以利用js代码调用java的更新数据显示到网页上以达到动态更新网页的目的。
三、js代码调用java代码操作步骤
1.开启使用js功能
webSettings.setJavaScriptEnabled(true);
2.设置编码默认编码格式(编码格式要和html编码格式对应)
webSettings.setDefaultTextEncodingName("gbk");
3.注入提供的java对象到webView:主要是这段代码,解释一下,第一个参数定义了一个对象,该对象中可以写任意的方法,供js代码调用。第二个参数是该自定义对象的一个别名。js调用该对象的方法时会使用到该别名。调用格式为:对象名.方法名。例如:jsobject.androidAlert();调用android的alert对话框。
webView.addJavascriptInterface(new JsObject(), "jsobject");
4.设置WebChromeClient对象,并实现其中的onJsAlert、onJsConfirm等方法。注意这里必须要实现这几个方法,不然js调用java代码弹框时可能没有反应。
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
// TODO Auto-generated method stub
return super.onJsAlert(view, url, message, result);
} @Override
public boolean onJsConfirm(WebView view, String url,
String message, JsResult result) {
// TODO Auto-generated method stub
return super.onJsConfirm(view, url, message, result);
} @Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
// TODO Auto-generated method stub
return super.onJsPrompt(view, url, message, defaultValue,
result);
}
四、android代码调用js代码
这个相对比较简单,只需要一行代码就能搞定:
例如:
//android调用js代码
webView.loadUrl("javascript:test_alert()");
做完以上几步后就可以实现真正调用了。下面给出完整代码
一、HTML代码jshtml.html(改代码放在assets文件夹下)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>这是一个HTML</title> <script type="text/javascript">
/*js调用android的方法*/
function jsCallAndroidAlert(){
jsobject.androidAlert();
} function test_alert() {
/* 弹出对话框 */
alert("啊哈!连Android系统都调用JS函数了");
} </script>
</head>
<body>
<button onclick="jsCallAndroidAlert()">test</button>
<button onclick="test_alert()">test_alert</button>
</body>
</html>
二、MainActivity.java
package com.yw.webkitdemo; import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast; @SuppressLint("JavascriptInterface")
public class MainActivity extends Activity implements android.view.View.OnClickListener{
private WebView webView;
private ProgressBar progressBar;
private Button btn_js;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
btn_js = (Button)findViewById(R.id.btn_js);
btn_js.setOnClickListener(this);
progressBar = new ProgressBar(this, null,
android.R.attr.progressBarStyleHorizontal);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
5)); webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
// 启用javascrip功能
webSettings.setJavaScriptEnabled(true);
//设置可以使用中文,否则会出现中文乱码
webSettings.setDefaultTextEncodingName("gbk");
webView.addView(progressBar);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
progressBar.setVisibility(View.GONE);
} else {
if (progressBar.getVisibility() == View.GONE)
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(newProgress);
}
super.onProgressChanged(view, newProgress);
} @Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
// TODO Auto-generated method stub
return super.onJsAlert(view, url, message, result);
} @Override
public boolean onJsConfirm(WebView view, String url,
String message, JsResult result) {
// TODO Auto-generated method stub
return super.onJsConfirm(view, url, message, result);
} @Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
// TODO Auto-generated method stub
return super.onJsPrompt(view, url, message, defaultValue,
result);
}
});
/*
* 此段代码在不做处理的情况下会弹出多个浏览器选择界面 webView.loadUrl("http://www.baidu.com/");
*/
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
} @Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
// webView.loadUrl("http://www.baidu.com/");
/**
* 自定义对象,以及对象别名
* 自定义对象中定义的方法可以供js调用
* function jsCallAndroidAlert(){
jsobject.androidAlert();
}
*/
webView.addJavascriptInterface(new JsObject(), "jsobject");
//加载我们自定义的html网页并将其显示在webView上
webView.loadUrl("file:///android_asset/jshtml.html");
} /**
* 此类的方法对应html中js的方法,供js调用Android的方法
*
* @author Administrator
*
*/
class JsObject {
public void androidAlert() {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("温馨提示");
dialog.setMessage("js调用了Android的Alert,测试完毕是否退出?");
dialog.setNegativeButton("否", new OnClickListener() { @Override
public void onClick(DialogInterface arg0, int arg1) { }
});
dialog.setPositiveButton("是", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog dialog2 = dialog.create();
dialog2.show();
Toast.makeText(MainActivity.this, "您使用js调用了alert方法",
Toast.LENGTH_LONG).show();
} public void androidConfirm() {
Toast.makeText(MainActivity.this, "您使用js调用了confirm方法",
Toast.LENGTH_LONG).show();
}
} /**
* 对系统的back键进行设置
*/
@Override
public void onBackPressed() {
if (webView != null && webView.canGoBack()) {
webView.goBack();
} else {
super.onBackPressed();
} } @Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_js:
//android调用js代码
webView.loadUrl("javascript:test_alert()");
break;
}
}
}
三、main_layout.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <Button
android:id="@+id/btn_js"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="调用javascript函数" /> </LinearLayout>
完成。
WebView之javascript与android交互基础加强的更多相关文章
- 在android中实现webview与javascript之间的交互(转)
参见“在android中实现webview与javascript之间的交互”
- Android中webview跟JAVASCRIPT中的交互
在android的应用程序中,可以直接调用webview中的javascript代码,而webview中的javascript代码,也可以去调用ANDROID应用程序(也就是JAVA部分的代码).下面 ...
- webview与JavaScript之间的交互
据说WebView的强大之处就是能和JavaScript进行交互调用. 参考博客:http://droidyue.com/blog/2014/09/20/interaction-between-jav ...
- 一处疑难杂症的术后总结:WebView和JavaScript之间的交互
近期在公司里參与了M3项目的开发,这个项目是使用HTML5开发的前端页面,在开发完成后,把项目地址写入Android.iOS的壳源代码里面,这样当应用被打开时候自己主动加载项目首页的URL.这样的做法 ...
- Android Webview 和Javascript交互,实现Android和JavaScript相互调用
在Android的开发过程中.遇到一个新需求.那就是让Java代码和Javascript代码进行交互.在IOS中实现起来很麻烦.而在Android中相对来说容易多了.Android对这种交互进行了很好 ...
- Android WebView与JavaScript交互操作(Demo)
应用场景: 为了使Android移动项目能够在较短的时间内完成开发,同时降低技术人员开发的成本投入,往往会采用Hybrid APP的开发模式.相关Hybrid APP(混合型应用)参看:http:// ...
- Android混合开发之WebView与Javascript交互
前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...
- Android中WebView的JavaScript代码和本地代码交互的三种方式
一.Android中WebView的漏洞分析最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视 ...
- Android总结之WebView与Javascript交互[转]
Android总结之WebView与Javascript交互 前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.We ...
随机推荐
- 教你用Cordova打包Vue项目
现在国内越来越多的开发者使用Vue开发混合app,但是当大家开发完成过后才发现不知道该怎么将Vue项目打包成app. 据我现在的了解打包Vue项目目前流行的就是使用weex和cordova.weex是 ...
- js-ES6学习笔记-module(2)
1.如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名. import { lastName as surname } from './profile'; 2.im ...
- MyEclipse优化设置(最详细版本)
MyEclipse优化设置由于自己需要,在网上查了相关资料,现在总结如下: 本优化方法较全,希望能帮助到需要的人... 第一步: 取消自动validation validation有一堆,什么xml. ...
- centos7 安装ldap
ldap首先我们要知道这个ldap的概念, LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写 目录是一个为查询.浏览和搜索而优化的专业分布 ...
- Use Jupyter notebook on Fedora 28
生产环境使用 Fedora 28, 并且需要搭建一个 Jupyter 的notebook 方便使用,所搭建的Jupyter 支持单人远程 密码访问 1. 安装 安装 Jupyter , 出错 [roo ...
- sudo控制权限简单用法介绍
为了安全及管理的方便,可将需要用root权限的用户加入到sudo管理,用root的权限来管理系统.利用sudo控制用户对系统命令的使用权限. 普通用户可以查看,但不能删除: 但是在/tmp公共环境下可 ...
- 【待补充】[Spark Core] Spark 实现标签生成
0. 说明 在 IDEA 中编写 Spark 代码实现将 JSON 数据转换成标签,分别用 Scala & Java 两种代码实现. 1. 准备 1.1 pom.xml <depend ...
- 李嘉诚 《Are you ready》
当你们梦想着为伟大成功的时候,你有没有刻苦的准备? 当你们有野心作领袖的时候,你有没有服务于人的谦恭? 我们常常都想有所获得,但我们有没有付出的情操? 我们都希望别人听到自己的话,我们有没有耐性聆听别 ...
- jQuery插件实例六:jQuery 前端分页
先来看看效果: 对于前端分页,关键是思路,和分页算法.本想多说两句,可又觉得没什么可说的,看代码吧: 如何使用? $("#pging").zPagination({ 'navEve ...
- CSS 居中大全(转)
引用:http://jinlong.github.io/blog/2013/08/13/centering-all-the-directions/ CSS 居中大全 AUG 13TH, 2013 | ...