热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用phoneGap和SenchaTouch2开发Android应用程序(四)

2019独角兽企业重金招聘Python工程师标准本文是“使用phoneGap和SenchaTouch2开发Android应用程序”系列教程的第4章,在这一章,我

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

         本文是“ 使用phoneGap和Sencha Touch 2开发Android应用程序”系列教程的第4章, 在这一章,我们会完成以下任务
  • 在笔记编辑视图中添加删除功能。
  • 在笔记编辑视图中,实现点击“返回”按钮回到笔记列表视图的功能。
  • 编辑笔记列表视图,使之按照笔记创建日期分组显示:

从Sencha Touch 数据存储中删除记录

        在笔记编辑视图中,当用户点击删除按钮时,删除操作就启动了:

        为了实现删除操作,我们需要给NoteEditor视图类添加一个处理点击删除事件的方法(NoteEditor视图类定义为NoteEditor.js ):

var deleteButton = {xtype: "button",iconCls: "trash",iconMask: true,handler: this.onDeleteButtonTap,scope: this
};

        就像给保存按钮添加事件处理方法一样,我们使用handler和scope两个配置参数,用来映射处理按钮点击事件的方法,同样这个方法的作用域仅限于本视图类。

        和之前一样,我们需要在NoteEditor视图类中添加一个 onDeleteButtonTap() 方法来向控制器传播事件。

onDeleteButtonTap: function () {console.log("deleteNoteCommand");this.fireEvent("deleteNoteCommand", this);
}

        和之前处理新增动作类似,我们需要在控制器的control中定义用于捕捉来自于noteEditor视图中的deleteNoteCommand事件:

control: {notesListContainer: {// The commands fired by the notes list container.newNoteCommand: "onNewNoteCommand",editNoteCommand: "onEditNoteCommand"},noteEditor: {// The commands fired by the note editor.saveNoteCommand: "onSaveNoteCommand",deleteNoteCommand: "onDeleteNoteCommand"}
}

        现在我们可以在onDeleteNoteCommand() 方法中实现删除笔记的逻辑:

    onDeleteNoteCommand: function(){// console.log("onDeleteNoteCommand");var noteEditor = this.getNoteEditor();// 当前编辑视图的引用var currentNote = noteEditor.getRecord();// 当前将被删除的笔记var notesStore = Ext.getStore("Notes");  // 本地数据库notesStore.remove(currentNote); // 从库中移除当前笔记notesStore.sync();//返回列表视图this.activateNotesList();}

        首先,在这里我们得到了当前所处于的编辑视图、将被删除的笔记以及本地的笔记库。请牢记,因为我们在refs配置参数中设置了noteEditor,所以可以使用框架为我们生成的getNoteEditor() 方法来获取当前编辑视图的引用。

refs: {// We're going to lookup our views by xtype.notesListContainer: "noteslistcontainer",noteEditor: "noteeditor"
}

        接着将当前笔记从笔记数据存储中删除并提交到本地数据库:

notesStore.remove(currentNote);
notesStore.sync();
        最后,从当前视图返回列表视图

this.activateNotesList();

         连接上设备或者启动模拟器,看看删除功能是否能够正常生效。

返回主页面

        为了让笔记编辑视图的返回按钮,能够使应用程序返回主视图(列表视图),而不保存编辑视图的改变,我们需要在Note Editor视图中给返回按钮添加单击事件的处理方法:

var backButton = {xtype: "button",ui: "back",text: "Home",handler: this.onBackButtonTap,scope: this
};

        定义onBackButtonTap()方法来传播事件:

onBackButtonTap: function () {console.log("backToHomeCommand");this.fireEvent("backToHomeCommand", this);
}

        在控制器中,添加对应backToHomeCommand事件的处理方法onBackToHomeCommand() :

control: {notesListContainer: {// The commands fired by the notes list container.newNoteCommand: "onNewNoteCommand",editNoteCommand: "onEditNoteCommand"},noteEditor: {// The commands fired by the note editor.saveNoteCommand: "onSaveNoteCommand",deleteNoteCommand: "onDeleteNoteCommand",backToHomeCommand: "onBackToHomeCommand"}
}
        在控制器中编写onBackToHomeCommand()方法:

onBackToHomeCommand: function () {console.log("onBackToHomeCommand");
this.activateNotesList();
}

        在这个方法中,不需要任何逻辑处理,直接调用activateNotesList()方法返回主视图即可,接下来可以启动模拟器,看看实际的运行效果。

对Sencha Touch列表设置分组

        现在我们来补充一个非常有用的功能:对保存的所有笔记按照创建日期进行分组显示。列表分组在Sencha Touch中非常容易实现。首先我们需要在Notes Store中定义一个grouper配置参数:

Ext.define("NotesApp.store.Notes",{extend:"Ext.data.Store",requires:"Ext.data.proxy.LocalStorage",config:{model:"NotesApp.model.Note",proxy : {type : "localstorage",id : "notes-app-store"},sorters:[{property:'dateCreated',direction:'DESC'}],grouper:{sortProperty:"dateCreated", // 按照创建日期进行分组direction : "DESC", // 日期倒序分组groupFn :function(record){if(record && record.data.dateCreated){return record.data.dateCreated.toDateString();}else{return '';}}}}
});

         在Sencha Touch的文档中没有对grouper进行很详细的解释,不过从上面的代码来看,grouper配置项并不是很难理解。groupFn方法负责生成分组的标签,在我们这个例子中,标签就是笔记创建的日期:

        sortProperty指定了按照哪个属性对分组进行排序,如果没有定义这个配置项,将按照groupFn 方法的返回值进行排序,direction则指定了分组是按升序还是降序排列。

        最后,我们需要在NoteList视图中添加与分组相关的配置参数:

Ext.define("NotesApp.view.NotesList",{extend:"Ext.dataview.List",alias:"widget.noteslist",config:{loadText:"正在加载笔记....",emptyText:'

没有找到相关笔记。
',onItemDisclosure:true,grouped:true,itemTpl:'
{title}
{narrative}
'}
});

        我们只需要设置grouped为true,列表就会自动按照Store中的分组定义进行分组,通过grouper配置项,我们就能非常方便的对列表进行分组显示。

        现在我们来看一下分组之后的应用程序运行情况,启动模拟器,就能看到所有的笔记按照日期分组显示了:


总结

        到目前为止,我们已经完成了新建、编辑和删除笔记的功能,而且实现了返回主列表视图的按钮功能。

        我们对Notes List 进行了重构,使得所有笔记能够根据保存日期进行分组显示,分组列表显示使用户能够更方便的查看笔记。

        在下一章中,我们将不再使用initialize方法来定义Notes List列表视图和Notes Editor编辑视图,而是采用配置参数的方式来定义。

        未完待续! 

下载

        源代码已发布到迅雷快传:http://kuai.xunlei.com/d/KSTEBUJWKTMR

        原文出自:  http://miamicoder.com/2012/how-to-create-a-sencha-touch-2-app-part-4/


本教程快速链接

  • 使用phoneGap和Sencha Touch 2开发Android应用程序(一)
  • 使用phoneGap和Sencha Touch 2开发Android应用程(二)
  • 使用phoneGap和Sencha Touch 2开发Android应用程序(三)
  • 使用phoneGap和Sencha Touch 2开发Android应用程序(四)
  • 使用phoneGap和Sencha Touch 2开发Android应用程序(五)




转载于:https://my.oschina.net/u/873661/blog/94369


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
author-avatar
lucky燕子加加加
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有