Android WebView与JavaScript交互实现Web App

当我们去开发一个基于web的android app时,我们第一须要处理的就是与JavaScript的交互问题。Android须要做的事情就是开放某些特定的接口供web里的JavaScript调用,能够开放弹出框功能,Toast,界面跳转等等。这样我们的web视图以假乱真的当成Android的原生界面。而这套web代码又能够嵌入iPhone的client中。也就是说Android和IOSclient不过提供一个共web使用的框架,业务都由web端处理。这岂不是开发一次。可处处执行。然而这一切都是后话,且让我们先实现WebView和JavaScript的交互问题。这里我以Android
app为例。

1. 首先在Eclipse中创建一个空的Android项目,我将它命名为JSInteraction。找到并打开AndroidManifest.xml文件,在Permissions里加入一个android.permission.WRITE_EXTERNAL_STORAGE权限。



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

2.这里我已经加入了一个主页面activity_main.xml,一个基本的Activity MainActivity.java。及一个提供各种功能供JavaScript调用的类JsOperator.java。

基本的文件夹结构例如以下图所看到的



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

主页面activity_main.xml代码例如以下所看到的。只唯独一个WebView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

MainActivity.java的代码例如以下所看到的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >表示加入供JS调用的对象。其别名是JsInteraction。这样在JS中仅仅要写JsInteraction.<方法名称>()就能够调用对应的方法了。WebView将载入assets目录里LoginJs目录下的login.html,这个文件会在后面创建。

package com.yld.jsinteraction;

import android.support.v7.app.ActionBarActivity;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.annotation.SuppressLint;
import android.os.Bundle;

public class MainActivity extends ActionBarActivity {

	private WebView webView;

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

		this.webView = (WebView) this.findViewById(R.id.webView);
		this.initializeWebView();
	}

	@SuppressLint({ "NewApi", "SetJavaScriptEnabled" })
	private void initializeWebView(){
		webView.addJavascriptInterface(new JsOperator(MainActivity.this),
				"JsInteraction");
		try {
			String url = "file:///android_asset/LoginJs/login.html";
			WebSettings webSettings = webView.getSettings();
			webSettings.setJavaScriptEnabled(true);
			webSettings.setAllowFileAccess(true);
			webSettings.setAllowFileAccessFromFileURLs(true);

			this.webView.loadUrl(url);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

JsOperator.java的代码例如以下

package com.yld.jsinteraction;

import org.json.JSONObject;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.webkit.JavascriptInterface;

public class JsOperator {

	private Context context;

	public JsOperator(Context context) {
		this.context = context;
	}

	/**
	 * 弹出消息对话框
	 */
	@JavascriptInterface
	public void showDialog(String message) {

		AlertDialog.Builder builder = new Builder(context);
		builder.setMessage(message);
		builder.setTitle("提示");
		builder.setPositiveButton("确认", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {

			}
		});
		builder.setNegativeButton("取消", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
		builder.create().show();
	}

	/**
	 * 获取登录的username和password
	 * @return JSON格式的字符串
	 */
	@JavascriptInterface
	public String getLoginInfo(){
		try{
			JSONObject login = new JSONObject();
			login.put("Username", "YLD");
			login.put("Password", "111");

			return login.toString();
		}catch(Exception e){
			e.printStackTrace();
		}

		return null;
	}
}

JsOperator提供了两个方法,一个方法用来弹出对话框,还有一个方法则是返回一个登录信息的JSON字符串,并且这两个方法都打上了标签@JavascriptInterface,这是比較重要的,由于在较低的版本号中假设不声明它是JavaScript可调用的方法。JS将无法调用。

3.在assets目录下创建LoginJs目录,并在其下创建两个文件login.html,login.js

login.html中有一个usernamepassword输入框及一个登录button。代码例如以下

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title id="title">Login</title>
	<script type="text/javascript" src="login.js"></script>
</head>
<body style="background:lightblue">
	<div style="margin-top: 20px;margin-left: 20px">
		<div>
			<label>Username:</label>
			<input id="txtUsername" type="text" style="margin-left: 20px"/>
		</div>
		<div style="margin-top: 20px">
			<label>Password:</label>
			<input id="txtPassword" type="text" style="margin-left: 20px"/>
		</div>
		<div style="margin-top: 20px;margin-left: 160px">
			<button onclick="loginObj.login()" style="width:100px">Login</button>
		</div>
	</div>
</body>
</html>

在login.js的setLoginInfo里使用JsInteraction.getLoginInfo()调用android提供的接口,并获取登录信息并将登录信息填充到用户输入框中,login方法则是调用了JsInteraction.showDialog("Login start...")来调用android端提供的弹出对话框的接口。

var Login = (function(){
	function Login(){

	}

	Login.prototype.login = function(){
		JsInteraction.showDialog("Login start...");
	}

	Login.prototype.setLoginInfo = function(){
		var logininfoJson = JsInteraction.getLoginInfo();
		//解析json字符串
		var logininfo = eval("("+logininfoJson+")");

		document.getElementById("txtUsername").value = logininfo.Username;
		document.getElementById("txtPassword").value = logininfo.Password;
	}

	return Login;
})();

var loginObj = new Login();

window.onload=function(){
	loginObj.setLoginInfo();
}

4.Html和client的创建已经完毕,执行效果例如以下

点击Loginbutton

源码下载页:http://download.csdn.net/detail/leyyang/8995887

时间: 2024-08-02 15:12:50

Android WebView与JavaScript交互实现Web App的相关文章

IOS UIWebView与JavaScript交互实现Web App

上一篇文章讲到了Android WebView与JavaScript的交互问题,现在来讲一下IOS的UIWebView与JavaScript的交互问题.和Android的相比,IOS的会略显笨拙一些不大友好,然而也算是在未引用第三方框架的基础上完成了交互的问题.OK,现在开始吧. 1.首先在IOSA->Application下选择Single View Application创建一个IOS应用,命名为JSInteraction,然后我删去了Info.plist文件里Main storyboard

Android WebView与JavaScript交互操作(Demo)

应用场景: 为了使Android移动项目能够在较短的时间内完成开发,同时降低技术人员开发的成本投入,往往会采用Hybrid APP的开发模式.相关Hybrid APP(混合型应用)参看:http://blog.csdn.net/mahoking/article/details/30235243 采用这种模式,为了解决更好的用户体验,可访问本地资源的能力.势必需要了解与掌握Android(java)与JavaScript之间的交互.相互调用操作的方法与技术. [转载使用,请注明出处:http://

Android Webview 和Javascript交互,实现Android和JavaScript相互调用

在Android的开发过程中.遇到一个新需求.那就是让Java代码和Javascript代码进行交互.在IOS中实现起来很麻烦.而在Android中相对来说容易多了.Android对这种交互进行了很好的封装.我们可以很简单的用Java代码调用WebView中的js函数.也可以用WebView中的js来调用Android应用中的Java代码. 案例主要包含了: Html中调用Android方法 Android调用JS方法无参数 Android调用JS方法有参数 Android调用JS方法有参数且有

Android:WebView与Javascript交互(相互调用参数、传值)

Android中可以使用WebView加载网页,同时Android端的java代码可以与网页上的javascript代码之间相互调用. 效果图: (一)Android部分: 布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_widt

WebView与JavaScript交互

在WebView中使用JavaScript 如果你想要载入的页面中用了JavaScript,你必须为你的WebView使能JavaScript. 一旦使能之后,你也可以自己创建接口在你的应用和JavaScript代码间进行交互. 前情提要:使能JavaScript 上一篇文章已经说过,可以通过getSettings()获得WebSettings,然后用setJavaScriptEnabled()使能JavaScript: WebView myWebView = (WebView) findVie

WebView与JavaScript交互--Android

转载请注明出处:  http://blog.csdn.net/forwardyzk/article/details/46819925 在工作中,有一个这种需求,须要用到WebView与javascript进行交互,以下我们就通过一个简单的需求来介绍. 先看一下效果图: 需求: 1.点击一个button进入一个载入WebView的界面,假设此界面须要分享此界面到其它平台,那么就在当前界面展示"分享"button,假设不须要分享,那么就不展示"分享"button. 2.

android webview和 javascript 进行交互

HTML5进行app开发具有开发快,跨平台等优点,但是当客户需要访问照相机或者调用摄像头等硬件的时候,H5就会有限制,必须要调用原生方法进行设备访问.下面简要介绍JS和原生方法互相调用的方法: 1 在webview的进行配置,首先支持JS和JS接口访问: 这里JSHook是一个Java类: 这里只是演示JS可以调用硬件,但并未实现如何将拍照的照片上传到服务器. 2 JS方法编写 上面注册的JSHook对象,再JS中对于kz,根结点都是window,即window.kz.QR() 就是webvie

android webview与js交互(动态添加js)

1.本地html与本地html里的js交互 2.本地html与本地js交互 3.网络html与网络js交互 4.网络html与本地js交互 5.各个情况动态添加js 以上5点都可以用一种方式来模拟,在本篇中采用本地html与本地js交互 (包含动态添加js的操作) 6.拦截url请求(在webview加载完成以后,触发的请求url) 7.拦截url请求后返回自己封装的数据(基于第6点,加载完成后,触发一些请求数据的url时拦截并自己封装数据返回给webview) 注:6.7点将在下一篇博客介绍

Android Webview与Html5交互

转:http://fangjie.info/?p=417#more-417   一.WebView.setWebViewClient(new MyWebViewClient()); 1.public boolean shouldOverrideUrlLoading(WebView view, String url) { onWebPageShouldLoad(view, url); //通过 return true; } 在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接