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

源代码结构图:

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

针对phonegap中activty扩展类:

  1. package com.easyway.phonegap.datepicker;
  2. import com.phonegap.*;
  3. import android.os.Bundle;
  4. /**
  5. * 实现DroidGap的
  6. *
  7. * @Title:
  8. * @Description: 实现 phonegap调用android中datepicker组件
  9. * @Copyright:Copyright (c) 2011
  10. * @Company:易程科技股份有限公司
  11. * @Date:2012-5-4
  12. * @author  longgangbai
  13. * @version 1.0
  14. */
  15. public class PhonegapDatePluginActivity extends DroidGap {
  16. /** Called when the activity is first created. */
  17. @Override
  18. public void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. //启动首页
  21. super.loadUrl("file:///android_asset/www/index.html");
  22. }
  23. }

插件实现类:

  1. package com.easyway.phonegap.datepicker;
  2. import java.util.Calendar;
  3. import org.json.JSONArray;
  4. import org.json.JSONException;
  5. import org.json.JSONObject;
  6. import android.app.DatePickerDialog;
  7. import android.app.DatePickerDialog.OnDateSetListener;
  8. import android.app.TimePickerDialog;
  9. import android.app.TimePickerDialog.OnTimeSetListener;
  10. import android.util.Log;
  11. import android.widget.DatePicker;
  12. import android.widget.TimePicker;
  13. import com.phonegap.api.PhonegapActivity;
  14. import com.phonegap.api.Plugin;
  15. import com.phonegap.api.PluginResult;
  16. import com.phonegap.api.PluginResult.Status;
  17. /**
  18. *
  19. * 实现DroidGap的在phonegap中想采用类似android中时间选择器datepicker
  20. *
  21. * @Title:
  22. * @Description: 实现 phonegap调用android中datepicker组件
  23. * @Copyright:Copyright (c) 2011
  24. * @Company:易程科技股份有限公司
  25. * @Date:2012-5-4
  26. * @author  longgangbai
  27. * @version 1.0
  28. */
  29. public class DatePickerPlugin extends Plugin {
  30. private static final String ACTION_DATE = "date";
  31. private static final String ACTION_TIME = "time";
  32. /*
  33. * 必须实现这个方法
  34. * (non-Javadoc)
  35. *
  36. * @see com.phonegap.api.Plugin#execute(java.lang.String,
  37. * org.json.JSONArray, java.lang.String)
  38. */
  39. @Override
  40. public PluginResult execute(final String action, final JSONArray data,
  41. final String callBackId) {
  42. Log.d("DatePickerPlugin", "Plugin Called");
  43. PluginResult result = null;
  44. if (ACTION_DATE.equalsIgnoreCase(action)) {
  45. Log.d("DatePickerPluginListener execute", ACTION_DATE);
  46. this.showDatePicker(callBackId);
  47. final PluginResult r = new PluginResult(
  48. PluginResult.Status.NO_RESULT);
  49. r.setKeepCallback(true);
  50. return r;
  51. } else if (ACTION_TIME.equalsIgnoreCase(action)) {
  52. Log.d("DatePickerPluginListener execute", ACTION_TIME);
  53. this.showTimePicker(callBackId);
  54. final PluginResult r = new PluginResult(
  55. PluginResult.Status.NO_RESULT);
  56. r.setKeepCallback(true);
  57. return r;
  58. } else {
  59. result = new PluginResult(Status.INVALID_ACTION);
  60. Log.d("DatePickerPlugin", "Invalid action : " + action + " passed");
  61. }
  62. return result;
  63. }
  64. public synchronized void showTimePicker(final String callBackId) {
  65. final DatePickerPlugin datePickerPlugin = this;
  66. final PhonegapActivity currentCtx = ctx;
  67. final Runnable runnable = new Runnable() {
  68. public void run() {
  69. final TimePickerDialog tpd = new TimePickerDialog(currentCtx,
  70. new OnTimeSetListener() {
  71. public void onTimeSet(final TimePicker view,
  72. final int hourOfDay, final int minute) {
  73. final JSONObject userChoice = new JSONObject();
  74. try {
  75. userChoice.put("hour", hourOfDay);
  76. userChoice.put("min", minute);
  77. } catch (final JSONException jsonEx) {
  78. Log.e("showDatePicker",
  79. "Got JSON Exception "
  80. + jsonEx.getMessage());
  81. datePickerPlugin.error(new PluginResult(
  82. Status.JSON_EXCEPTION), callBackId);
  83. }
  84. datePickerPlugin.success(new PluginResult(
  85. PluginResult.Status.OK, userChoice),
  86. callBackId);
  87. }
  88. }, 1, 1, true);
  89. tpd.show();
  90. }
  91. };
  92. ctx.runOnUiThread(runnable);
  93. }
  94. public synchronized void showDatePicker(final String callBackId) {
  95. final DatePickerPlugin datePickerPlugin = this;
  96. final PhonegapActivity currentCtx = ctx;
  97. final Calendar c = Calendar.getInstance();
  98. final int mYear = c.get(Calendar.YEAR);
  99. final int mMonth = c.get(Calendar.MONTH);
  100. final int mDay = c.get(Calendar.DAY_OF_MONTH);
  101. final Runnable runnable = new Runnable() {
  102. public void run() {
  103. final DatePickerDialog dpd = new DatePickerDialog(currentCtx,
  104. new OnDateSetListener() {
  105. public void onDateSet(final DatePicker view,
  106. final int year, final int monthOfYear,
  107. final int dayOfMonth) {
  108. final JSONObject userChoice = new JSONObject();
  109. try {
  110. userChoice.put("year", year);
  111. userChoice.put("month", monthOfYear);
  112. userChoice.put("day", dayOfMonth);
  113. } catch (final JSONException jsonEx) {
  114. Log.e("showDatePicker",
  115. "Got JSON Exception "
  116. + jsonEx.getMessage());
  117. datePickerPlugin.error(new PluginResult(
  118. Status.JSON_EXCEPTION), callBackId);
  119. }
  120. datePickerPlugin.success(new PluginResult(
  121. PluginResult.Status.OK, userChoice),
  122. callBackId);
  123. }
  124. }, mYear, mMonth, mDay);
  125. dpd.show();
  126. }
  127. };
  128. ctx.runOnUiThread(runnable);
  129. }
  130. }

phonegap中plugin.xml中配置:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <plugins>
  3. <plugin name="App" value="com.phonegap.App"/>
  4. <plugin name="Geolocation" value="com.phonegap.GeoBroker"/>
  5. <plugin name="Device" value="com.phonegap.Device"/>
  6. <plugin name="Accelerometer" value="com.phonegap.AccelListener"/>
  7. <plugin name="Compass" value="com.phonegap.CompassListener"/>
  8. <plugin name="Media" value="com.phonegap.AudioHandler"/>
  9. <plugin name="Camera" value="com.phonegap.CameraLauncher"/>
  10. <plugin name="Contacts" value="com.phonegap.ContactManager"/>
  11. <plugin name="Crypto" value="com.phonegap.CryptoHandler"/>
  12. <plugin name="File" value="com.phonegap.FileUtils"/>
  13. <plugin name="Network Status" value="com.phonegap.NetworkManager"/>
  14. <plugin name="Notification" value="com.phonegap.Notification"/>
  15. <plugin name="Storage" value="com.phonegap.Storage"/>
  16. <plugin name="Temperature" value="com.phonegap.TempListener"/>
  17. <plugin name="FileTransfer" value="com.phonegap.FileTransfer"/>
  18. <plugin name="Capture" value="com.phonegap.Capture"/>
  19. <plugin name="DatePickerPlugin" value="com.easyway.phonegap.datepicker.DatePickerPlugin"/>
  20. </plugins>

插件对应的js的编写:

  1. /**
  2. *
  3. * @return Object literal singleton instance of DatePicker
  4. */
  5. var DatePicker = function() {
  6. };
  7. DatePicker.prototype.showDateOrTime = function(action,successCallback, failureCallback) {
  8. return PhoneGap.exec(
  9. successCallback,    //Success callback from the plugin
  10. failureCallback,     //Error callback from the plugin
  11. 'DatePickerPlugin',  //Tell PhoneGap to run "DatePickerPlugin" Plugin
  12. action,              //Tell plugin, which action we want to perform
  13. []);        //Passing list of args to the plugin
  14. };
  15. /**
  16. * Enregistre une nouvelle bibliothèque de fonctions
  17. * auprès de PhoneGap
  18. **/
  19. PhoneGap.addConstructor(function() {
  20. //如果不支持window.plugins,则创建并设置
  21. if(!window.plugins){
  22. window.plugins={};
  23. }
  24. window.plugins.datePickerPlugin=new DatePicker();
  25. //向phonegap中注入插件相关的js
  26. //Register the javascript plugin with PhoneGap
  27. PhoneGap.addPlugin('datePickerPlugin', new DatePicker());
  28. //phonegap中注入后台插件相关的java类
  29. //Register the native class of plugin with PhoneGap
  30. PluginManager.addService("DatePickerPlugin",
  31. "com.easyway.phonegap.datepicker.DatePickerPlugin");
  32. });

页面调用如下:

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=320; user-scalable=no" />
  5. <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  6. <title>Minimal AppLaud App</title>
  7. <!-- 加载phonegap -->
  8. <script type="text/javascript" charset="utf-8" src="phonegap-1.4.1.js"></script>
  9. <!-- 加载jquery -->
  10. <script type="text/javascript" charset="utf-8" src="jquery.mobile/jquery-1.6.4.min"></script>
  11. <!-- 加载jquerymobile -->
  12. <script type="text/javascript" charset="utf-8" src="jquery.mobile/jquery.mobile-1.0.1.js"></script>
  13. <!-- 加载自定义插件 -->
  14. <script type="text/javascript" charset="utf-8" src="datePickerPlugin.js"></script>
  15. <script type="text/javascript" charset="utf-8">
  16. $(function(){
  17. $("#datepicker").click(function(){
  18. alert("0000000");
  19. window.plugins.datePickerPlugin.showDateOrTime(
  20. 'date',
  21. function(r){
  22. document.getElementById("mydatetargetfield").value = r.day + "/" + r.month + "/" + r.year;
  23. },
  24. function(e){console.log(e);}
  25. );
  26. });
  27. });
  28. </script>
  29. </head>
  30. <body  class="theme">
  31. <input id="mydatetargetfield" type="text" />
  32. <input id="datepicker" type="button" value="时间选择器">
  33. </body>
  34. </html>

运行结果如下:

Phonegap中自定义插件的使用的更多相关文章

  1. PhoneGap之自定义插件

    PhoneGap:作为原生App,Java(这里面是指Android的)与JavaScript 的通信桥梁,使得我们的混合开发更加得心应手,我是与Android结合的混合开发. 但在这里不得不吐槽一下 ...

  2. Vue学习之--------Vue中自定义插件(2022/8/1)

    文章目录 1.插件的基本介绍 2.实际应用 2.1 目录结构 2.2 代码实例 2.2.1 学校组件(School.vue) 2.2.2 学生组件(Student.vue) 2.2.3 定义的插件 2 ...

  3. 浅析MyBatis(三):聊一聊MyBatis的实用插件与自定义插件

    在前面的文章中,笔者详细介绍了 MyBatis 框架的底层框架与运行流程,并且在理解运行流程的基础上手写了一个自己的 MyBatis 框架.看完前两篇文章后,相信读者对 MyBatis 的偏底层原理和 ...

  4. cordova /phonegap 自定义插件

    ### cordova /phonegap 自定义插件 在使用cordova 的过程中,虽然官方提供的插件以及其他人开源的插件较多.但有时为了实现某种需求,还是需要自己编写插件. 以前总是会手动的配置 ...

  5. Ionic2中集成腾讯Bugly之自定义插件

    Ionic2混合开发,入坑系列:Ionic2中集成腾讯Bugly之自定义插件 1.编写Bugly.js代码 var exec = require('cordova/exec'); module.exp ...

  6. vue中自定义组件(插件)

    vue中自定义组件(插件) 原创 2017年01月04日 22:46:43 标签: 插件 在vue项目中,可以自定义组件像vue-resource一样使用Vue.use()方法来使用,具体实现方法: ...

  7. Cordova与现有框架的结合,Cordova插件使用教程,Cordova自定义插件,框架集成Cordova,将Cordova集成到现有框架中

    一.框架集成cordova 将cordova集成到现有框架中 一般cordova工程是通过CMD命令来创建一个工程并添加Android.ios等平台,这样的创建方式可以完整的下载开发过程中所需要的的插 ...

  8. Phonegap 自定义插件

    一.PhoneGap中js与Java之间相互调用分为同步和异步两种方式 1.同步:js调用Java类的方法,然后Java类的方法直接返回一个值给js端 2.异步:js调用Java类的方法,Java类的 ...

  9. cordova3.X 运用grunt生成plugin自定义插件骨架

    Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.Cordova还提供了一组统一的JavaScript类库,以及为这些 ...

随机推荐

  1. Linux之RHEL6的开机流程分析

    开机——很多人觉得很简单的事情,只要按下电源开关,然后系统就会自然启动,没有什么需要学习的.其实不然,如果系统没有什么问题,可以正常登陆的时候,当然开机很简单.但更多的时候,我们需要知道当机子不能正常 ...

  2. TTradmin v1.1 - 免端口映射穿透任何内网、基于radmin核心的即时远程协助

        TTradmin 是一款免端口映射可直接穿透任何内网,基于radmin核心的即时远程协助软件.在使用的时候只需要保证“协助端”和“被协助端”使用同一个验证码即可实现安全便捷的远程控制,不需要进 ...

  3. 服务器断电保护神v2.2

    下载链接: https://pan.baidu.com/s/1bph5IFX 密码: evbn 使用说明:①每15秒检测一次,当列表内的主机PING不通时将执行关机②支持4种关机方式,理论上第一种方式 ...

  4. 文本数据源Fields Format

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. Repeater多列分别合并单元格

    GridView.Repeater合并单元格可以参考http://www.cnblogs.com/zhmore/archive/2009/04/22/1440979.html,但是原文例子是合并一列的 ...

  6. hihoCoder 1426 : What a Ridiculous Election(总统夶选)

    hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - ...

  7. XAF点滴:很具体很用实用---处理三个小问题

    以下内容全部为web版本的老模板风格下完成. 一.在编辑状态的详细视图下打印报表. 有些时候,需要在编辑状态下直接打印报表内容,官方默认是不允许这样做的.用Reflector查看源码,可以看到: De ...

  8. C#引用C++开发的DLL

    C#语言使用方便,入门门槛较代,上手容易,并且语法与C,java有很类似的地方,IDE做的也好,通用性好,是MS下一代开发的主要力量.但是其开源代码较少,类库不是十分完美,在架构方面还有一些需要做的工 ...

  9. App开发(Android与php接口)之:短信验证码

    最近和同学们一起开发一个自主项目,要用到短信验证码,在网上搜索了很久,看到一个推荐贴,提到了很多不错的短信服务商.经过测试,帖子中提到的服务商他们的短信到达率和到达速度也都不错.最后,由于经费问题,我 ...

  10. 理解RESTful

    REST全称为Representational State Transfer,可以翻译为“表现状态转换”,是由是Roy Thomas Fielding在他2000年的博士论文中提出的,目的是为了得到一 ...