`
longgangbai
  • 浏览: 7339100 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

         在phonegap中需要实现特定相关的功能,可能需要自定义扩展一下功能,那么扩展phonegap组件就成为了可能。

 

源代码结构图:

 

   本文目的在于讲述怎么扩展一个phonegap组件以及实现。

 针对phonegap中activty扩展类:

package com.easyway.phonegap.datepicker;

import com.phonegap.*;
import android.os.Bundle;
/**
 * 实现DroidGap的
 * 
 * @Title: 
 * @Description: 实现 phonegap调用android中datepicker组件
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-5-4
 * @author  longgangbai
 * @version 1.0
 */
public class PhonegapDatePluginActivity extends DroidGap {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //启动首页
        super.loadUrl("file:///android_asset/www/index.html");
    }
}

 

 

插件实现类:

package com.easyway.phonegap.datepicker;

import java.util.Calendar;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.util.Log;
import android.widget.DatePicker;
import android.widget.TimePicker;

import com.phonegap.api.PhonegapActivity;
import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;
import com.phonegap.api.PluginResult.Status;

/**
 * 
 * 实现DroidGap的在phonegap中想采用类似android中时间选择器datepicker
 * 
 * @Title: 
 * @Description: 实现 phonegap调用android中datepicker组件
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-5-4
 * @author  longgangbai
 * @version 1.0
 */
public class DatePickerPlugin extends Plugin {

	private static final String ACTION_DATE = "date";
	private static final String ACTION_TIME = "time";

	/*
	 * 必须实现这个方法
	 * (non-Javadoc)
	 * 
	 * @see com.phonegap.api.Plugin#execute(java.lang.String,
	 * org.json.JSONArray, java.lang.String)
	 */
	@Override
	public PluginResult execute(final String action, final JSONArray data,
			final String callBackId) {
		Log.d("DatePickerPlugin", "Plugin Called");
		PluginResult result = null;

		if (ACTION_DATE.equalsIgnoreCase(action)) {
			Log.d("DatePickerPluginListener execute", ACTION_DATE);
			this.showDatePicker(callBackId);
			final PluginResult r = new PluginResult(
					PluginResult.Status.NO_RESULT);
			r.setKeepCallback(true);
			return r;

		} else if (ACTION_TIME.equalsIgnoreCase(action)) {
			Log.d("DatePickerPluginListener execute", ACTION_TIME);
			this.showTimePicker(callBackId);
			final PluginResult r = new PluginResult(
					PluginResult.Status.NO_RESULT);
			r.setKeepCallback(true);
			return r;

		} else {
			result = new PluginResult(Status.INVALID_ACTION);
			Log.d("DatePickerPlugin", "Invalid action : " + action + " passed");
		}

		return result;
	}

	public synchronized void showTimePicker(final String callBackId) {
		final DatePickerPlugin datePickerPlugin = this;
		final PhonegapActivity currentCtx = ctx;

		final Runnable runnable = new Runnable() {

			public void run() {
				final TimePickerDialog tpd = new TimePickerDialog(currentCtx,
						new OnTimeSetListener() {

							public void onTimeSet(final TimePicker view,
									final int hourOfDay, final int minute) {
								final JSONObject userChoice = new JSONObject();
								try {
									userChoice.put("hour", hourOfDay);
									userChoice.put("min", minute);
								} catch (final JSONException jsonEx) {
									Log.e("showDatePicker",
											"Got JSON Exception "
													+ jsonEx.getMessage());
									datePickerPlugin.error(new PluginResult(
											Status.JSON_EXCEPTION), callBackId);
								}
								datePickerPlugin.success(new PluginResult(
										PluginResult.Status.OK, userChoice),
										callBackId);

							}
						}, 1, 1, true);

				tpd.show();
			}
		};
		ctx.runOnUiThread(runnable);

	}

	public synchronized void showDatePicker(final String callBackId) {

		final DatePickerPlugin datePickerPlugin = this;
		final PhonegapActivity currentCtx = ctx;
		final Calendar c = Calendar.getInstance();
		final int mYear = c.get(Calendar.YEAR);
		final int mMonth = c.get(Calendar.MONTH);
		final int mDay = c.get(Calendar.DAY_OF_MONTH);

		final Runnable runnable = new Runnable() {

			public void run() {
				final DatePickerDialog dpd = new DatePickerDialog(currentCtx,
						new OnDateSetListener() {

							public void onDateSet(final DatePicker view,
									final int year, final int monthOfYear,
									final int dayOfMonth) {

								final JSONObject userChoice = new JSONObject();

								try {
									userChoice.put("year", year);
									userChoice.put("month", monthOfYear);
									userChoice.put("day", dayOfMonth);
								} catch (final JSONException jsonEx) {
									Log.e("showDatePicker",
											"Got JSON Exception "
													+ jsonEx.getMessage());
									datePickerPlugin.error(new PluginResult(
											Status.JSON_EXCEPTION), callBackId);
								}

								datePickerPlugin.success(new PluginResult(
										PluginResult.Status.OK, userChoice),
										callBackId);

							}
						}, mYear, mMonth, mDay);

				dpd.show();
			}
		};
		ctx.runOnUiThread(runnable);
	}

}

 

 

phonegap中plugin.xml中配置:

<?xml version="1.0" encoding="utf-8"?>
<plugins>
    <plugin name="App" value="com.phonegap.App"/>
    <plugin name="Geolocation" value="com.phonegap.GeoBroker"/>
    <plugin name="Device" value="com.phonegap.Device"/>
    <plugin name="Accelerometer" value="com.phonegap.AccelListener"/>
    <plugin name="Compass" value="com.phonegap.CompassListener"/>
    <plugin name="Media" value="com.phonegap.AudioHandler"/>
    <plugin name="Camera" value="com.phonegap.CameraLauncher"/>
    <plugin name="Contacts" value="com.phonegap.ContactManager"/>
    <plugin name="Crypto" value="com.phonegap.CryptoHandler"/>
    <plugin name="File" value="com.phonegap.FileUtils"/>
    <plugin name="Network Status" value="com.phonegap.NetworkManager"/>
    <plugin name="Notification" value="com.phonegap.Notification"/>
    <plugin name="Storage" value="com.phonegap.Storage"/>
    <plugin name="Temperature" value="com.phonegap.TempListener"/>
    <plugin name="FileTransfer" value="com.phonegap.FileTransfer"/>
    <plugin name="Capture" value="com.phonegap.Capture"/>
    <plugin name="DatePickerPlugin" value="com.easyway.phonegap.datepicker.DatePickerPlugin"/>
</plugins>

 

插件对应的js的编写:

/**
 *  
 * @return Object literal singleton instance of DatePicker
 */
var DatePicker = function() {
	
};

DatePicker.prototype.showDateOrTime = function(action,successCallback, failureCallback) {
	 return PhoneGap.exec( 
	 successCallback,    //Success callback from the plugin
	 failureCallback,     //Error callback from the plugin
	 'DatePickerPlugin',  //Tell PhoneGap to run "DatePickerPlugin" Plugin
	 action,              //Tell plugin, which action we want to perform
	 []);        //Passing list of args to the plugin
};

/**
 * Enregistre une nouvelle bibliothèque de fonctions
 * auprès de PhoneGap
 **/

PhoneGap.addConstructor(function() {
    //如果不支持window.plugins,则创建并设置
    if(!window.plugins){
        window.plugins={};
    }
    window.plugins.datePickerPlugin=new DatePicker();
    //向phonegap中注入插件相关的js
    //Register the javascript plugin with PhoneGap
    PhoneGap.addPlugin('datePickerPlugin', new DatePicker());
    //phonegap中注入后台插件相关的java类
  //Register the native class of plugin with PhoneGap
    PluginManager.addService("DatePickerPlugin",
                         "com.easyway.phonegap.datepicker.DatePickerPlugin");
});

 

页面调用如下:

<!DOCTYPE HTML>
<html>
  <head>
    <meta name="viewport" content="width=320; user-scalable=no" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>Minimal AppLaud App</title>
    <!-- 加载phonegap -->
	<script type="text/javascript" charset="utf-8" src="phonegap-1.4.1.js"></script>
	<!-- 加载jquery -->
	<script type="text/javascript" charset="utf-8" src="jquery.mobile/jquery-1.6.4.min"></script>
    <!-- 加载jquerymobile -->
	<script type="text/javascript" charset="utf-8" src="jquery.mobile/jquery.mobile-1.0.1.js"></script>
    <!-- 加载自定义插件 -->
    <script type="text/javascript" charset="utf-8" src="datePickerPlugin.js"></script>
	<script type="text/javascript" charset="utf-8">
      
     $(function(){
     	$("#datepicker").click(function(){
     	    alert("0000000");
    	      window.plugins.datePickerPlugin.showDateOrTime(
        			'date',
        			function(r){
        				document.getElementById("mydatetargetfield").value = r.day + "/" + r.month + "/" + r.year;
        			},
        			function(e){console.log(e);}
        		);
     	});
     });
</script>  

  </head>
  <body  class="theme">
    <input id="mydatetargetfield" type="text" />
   <input id="datepicker" type="button" value="时间选择器">
  </body>
</html>

 

运行结果如下:

 

源代码如下:

 

分享到:
评论
1 楼 njtxd239 2013-04-09  

相关推荐

    PhoneGap iOS 自定义插件

    PhoneGap iOS 自定义插件是移动应用开发中的一个重要概念,它允许开发者利用JavaScript与原生iOS平台进行交互,实现更高效、更丰富的功能。PhoneGap是一个开源框架,它基于Apache Cordova,允许开发者使用HTML、CSS...

    android PhoneGap 自定义插件

    这个特定的“android PhoneGap 自定义插件”是关于在Android平台上扩展PhoneGap功能的一个实例,通过编写自定义插件,开发者可以调用Android的本地API,实现更丰富的功能,比如访问硬件设备、系统服务等。...

    phonegap4.0自定义插件demo

    这是基于cordova4.2的自定义插件demo org.apache.cordova.toast是插件 phonegapplugin4是包含了cordovaLib的工程 详细教程可看我博客http://blog.csdn.net/kong92917

    自定义plugin插件实现phonegap与Android交互

    在"自定义plugin插件实现phonegap与Android交互"这个主题中,我们主要关注的是如何通过编写自定义插件来打通JavaScript和Android之间的通信壁垒。在PhoneGap中,Plugin是连接Web层和Native层的桥梁,它们是用Java...

    Phonegap自定义插件例子

    Phonegap自定义插件例子(Android) cordova3.4 详细课参阅我的博客: http://blog.csdn.net/xiaoluo5238/article/details/38711331

    phonegap/Cordova和android自定义插件模块,cordova build后插件不会消失

    总的来说,理解和解决PhoneGap和Cordova中的自定义插件问题需要对这两个框架的工作原理有深入的理解,同时也需要熟悉Android的开发环境。遵循上述步骤,你应该能够有效地创建、管理和修复自定义插件的问题。

    phonegap打开文档插件

    在`FileOpener`压缩包中,可能包含的是这个插件的源码或者预编译版本,供开发者自定义或学习使用。了解其工作原理和结构有助于更有效地集成和定制插件功能。 总之,PhoneGap打开文档插件是使PhoneGap应用具备打开和...

    phonegap开发插件合集

    这个"phonegap-phonegap-plugins-2dc6525"压缩包中的所有这些插件都是PhoneGap社区的贡献,它们经过了多次迭代和优化,旨在帮助开发者轻松地增强其应用的功能。通过集成这些插件,开发者可以充分利用PhoneGap的跨...

    phonegap调用android插件实现GPS定位

    在Android中,GPS定位涉及到Android的Location API,因此我们需要创建一个自定义的PhoneGap插件来调用这些API。 二、Android Location API Android的Location API提供了获取设备位置的能力,包括GPS(全球定位系统...

    phonegap plugins (插件集)

    了解如何创建自定义插件对于扩展PhoneGap应用的功能非常有用,特别是当需要的特性未被现有的公共插件覆盖时。 总的来说,PhoneGap插件是连接Web应用和移动设备硬件的桥梁,它们使开发者能够充分利用跨平台框架的...

    Phonegap在安卓平台上的插件开发

    在Android平台上,自定义插件的开发为PhoneGap应用扩展了无限的可能性,使开发者能够访问Android系统的所有功能,同时保持HTML5应用的开发效率和可移植性。这个具体的MD5加密插件示例是一个很好的起点,可以帮助...

    PhoneGap的API组件及使用方法

    PhoneGap项目中可能包含第三方库或自定义插件,例如在`phoneGap.rar`中可能有预编译的插件或特定平台的配置文件。这些文件需要正确解压并放入项目结构的相应位置,然后在`config.xml`中注册,以便在应用中使用。 ...

    phonegap完整例子!

    - 创建PhoneGap项目时,首先需要在命令行中使用PhoneGap或Cordova CLI初始化一个新的项目结构。 - 配置项目的`config.xml`文件,设置应用的元数据,如应用名称、版本号、权限等。 - 将HTML、CSS和JavaScript代码...

    phonegap插件包Android版本

    4. **插件开发**:如果你需要自定义特定功能,你可以开发自己的PhoneGap插件。这涉及到编写JavaScript接口(通常位于`www`目录下的JS文件),以及对应的Android Java类,该类继承自CordovaPlugin,并重写`execute()`...

    corodova自定义的插件源码

    在这个特定的场景中,我们关注的是在iOS平台上为Cordova开发自定义插件的过程,这涉及到XML配置文件和Objective-C(OC)源代码的编写。 首先,Cordova的核心理念是通过WebView来呈现Web应用,同时通过插件系统与...

    phoneGap极光推送插件。

    PhoneGap与极光推送插件是移动应用开发中的两个重要工具。PhoneGap是一个开源框架,它允许开发者使用HTML、CSS和JavaScript来构建跨平台的原生移动应用。它通过Apache Cordova将这些Web技术转化为可以在iOS、Android...

    PhoneGap插件扩展

    在PhoneGap项目中添加自定义插件,需要在`config.xml`中声明该插件,并确保在编译时将Java或Objective-C代码包含到项目中。对于Android,可能还需要在`res/xml/config.xml`中配置权限,如显示对话框所需的`android....

    Phonegap iOS 的web 应用插件demo

    总结来说,PhoneGap iOS的Web应用插件Demo是一个学习和实践PhoneGap插件开发的实例,通过PANativeBridgeDemo,开发者可以了解到如何创建、使用和管理自定义插件,以便在Web应用中充分利用iOS设备的功能。这样的实践...

    二、phoneGap项目中使用二维码扫描功能

    例如,`cordova.plugins.QRScanner` 对象在`qrscanner`插件中提供扫描功能。我们可以使用这些接口启动扫描、暂停扫描、关闭相机,以及处理扫描结果。 4. **使用示例**: 以下是一个简单的JavaScript代码示例,展示...

Global site tag (gtag.js) - Google Analytics