第十章 简易家庭帐本_系统设置

上一章我们实现了收入记录功能,在收入记录的7项信息中,有三项为选择项(收入类别、收入者及支付方式),用户从若干个预设选项中选择某个值。在这三个系统预置的选项中,除收入类别外,其他两项用户可以根据自己的需要进行增删改操作。从用户的角度来看,在正式开始输入数据之前,应该首先设置这些选项,至少家庭成员一项是必须设置的。不过,从开发者的角度来看,我们并没有把“系统设置”功能的实现置于“收入记录”之前,这样的安排是有原因的。

对于帐本应用来说,收入支出的记录、查询及统计是应用的核心功能。一方面,从信息处理的顺序上讲,“收入记录”算是“输入”环节(另外两个环节是信息的处理及输出),理应先行实现;另一方面,相对于“支出记录”来说,“收入记录”的数据项(7项)要少于支出记录,功能的实现相对简单,因此,按照从易到难的顺序来说,也应该首先实现收入记录。

系统设置功能是帐本应用的辅助功能,虽然它的实现过程比“收入记录”还要简单,但是有一种可能性是存在的,即,在开发之初,我们对预设项进行了规划,包括有哪些预设项、每个预设项有哪些可选项等等,但是当我们在开发核心功能时,经常会发现我们对预设项的规划并不能很好地满足信息处理的要求,这时我们会对预设项进行调整。假如我们首先实现了“系统设置”功能,那么这样的调整就意味着此前的工作必须推倒重来,这势必造成人力与时间的浪费。

鉴于以上的原因,我们首先实现“收入记录”功能,然后再实现“系统设置”功能。

第一节 功能描述

系统设置包含三大类设置:

  1. 预设项设置:包括三项操作——新增、修改以及删除,用户可以自行设置的项包括:
    • 支出二级分类
    • 支出专项
    • 家庭成员
    • 支付方式
  2. 密码重置:用户输入原有密码,再输入新密码并加以确认,可以实现对密码的重置;
  3. 恢复默认设置:清除应用的现有设置,从文件CATEGORY.txt中重新加载预设项。

第二节 数据模型

一、支出二级分类

支出二级分类从属于支出一级分类,因此,在设置二级分类时,必然会涉及到一级分类。

1、支出一级分类:

为一级列表,是系统的预设项,共有12个列表项,内容不可更改,表示成列表的支出一级分类如图10-1所示。

图10-1 支出一级分类

2、支出二级分类

支出二级分类为二级列表,其中一级列表中包含12个列表项,与一级分类的列表项一一对应;二级列表中所含的列表项数量不等,用户可以对这些项进行增删改操作,应用初始化时,其预设内容如图10-2所示。

图10-2 支出二级分类

二、支出专项

支出专项的数据结构为三级列表,应用中预设了四个专项。一级列表中预设了4个列表项,为二级列表;每个二级列表中包含2个列表项,为三级列表;每个三级列表中包含2个列表项,分别为“键”和“值”,预设专项的具体内容如图10-3所示。

图10-3 支出专项的三级列表

三、家庭成员与支付方式

这两项数据很简单,均为一级列表,其预设内容如图10-4所示。

图10-4 家庭成员与支付方式的预设选项

四、重置密码

该功能只涉及一个数据——密码。

第三节 界面设计

一、页面布局

在用户界面中,沿垂直方向有三个根一级的组件(直接放置在屏幕中的组件):

  1. 屏幕顶部放置一个列表选择框,用于选择需要设置的项;
  2. 用一个垂直布局组件充当容器,其中的组件用来实现对预设项的设置,当用户选择设置预设项时,显示该容器,当用户选择密码重置时,隐藏该容器;
  3. 用另一个垂直布局组件容纳与密码设置相关的组件,当进行密码重置时,显示该容器,当设置预设项时,隐藏该容器;

除此以外,对话框组件用于实现恢复默认设置功能。如图10-5所示,在设计视图的组件列表中,可以看到布局组件与功能组件之间的包含关系。

图10-5 系统设置屏幕的界面设计

为了显示界面组件之间的关系,图10-5中的所有组件都设为允许显示,我们将利用程序来控制某些组件的显示及隐藏。

二、组件属性设置

图10-5中组件的属性设置参见表10- 1。

表10- 1 系统设置屏幕中组件的属性设置

第四节 界面逻辑

1、屏幕初始化

屏幕初始化时,自动打开设置选择框,显示其中的6个选项:支出二级分类、支出专项、家庭成员、支付方式、密码重置以及恢复默认设置。

2、设置预设项

当用户从设置选择框中选中某预设项后(支出二级分类、支出专项、家庭成员、支付方式):

  • 设置组件的显示与隐藏:显示预设项容器,隐藏密码重置容器;如果选中的是支出专项,则显示专项激活复选框,否则隐藏该复选框;如果选中的是支出二级分类,则显示一级分类下拉框,否则隐藏该下拉框;
  • 数据绑定:从数据库中加载选中项的现有选项,将其设置为设置项下拉框的列表属性;
  • 修改与删除:用户选中了设置项下拉框中的某项时,将该项内容填写到预设项输入框中,此时保存按钮的显示文本为“修改”,用户可以修改输入框中的内容,并点击“修改”按钮(实际上是保存按钮),完成选项的修改;此时用户也可以点击删除按钮,删除该选项;
  • 新增:用户点击“新增”按钮,此时清空预设项输入框,保存按钮的显示文本为“保存”,用户在输入框中输入新的设置项后,点击保存按钮,将新增内容添加到原有设置中;
  • 新增、修改或删除某项后,更新设置项下拉框的列表属性,将更新后的设置保存到数据库,并将输入表单恢复到初始状态(等同于点击新增按钮)。

3、重置密码

当用户从设置选择框中选择了重置密码后:

  • 设置组件的显示与隐藏:显示密码重置容器,隐藏预设项容器;
  • 用户需要输入原密码、新密码并确认新密码,然后点击重置按钮;
  • 检查用户输入的原密码,判断其是否与此前设置的密码一致;检查新密码与确认密码是否一致;如果两项检查都获通过,则将新密码保存至数据库,否则提示用户输入的信息有误;
  • 密码修改完成后,再次打开设置选择框,以便用户选择其它的设置项。

4、恢复默认设置

当用户选择了恢复默认设置后:

  • 弹出对话框,询问用户是否确认要放弃原有设置,并提供“确定”及“取消”两个选项;
  • 当用户选择“确定”后,从数据库中删除所有预设项,读取CATEGORY.txt文件,将文件内容解析后保存到数据库中;
  • 当用户选择“取消”时,关闭对话框,打开设置选择框,等待用户进行其他选择。

第五节 编写程序——选择设置项

一、屏幕初始化

屏幕初始化程序非常简单,将固定的六个选项拼成逗号分隔的字串,将其设置为设置选择框的逗号分隔字串属性,并打开选择框供用户选择。代码如图10-6所示。

图10-6 设置屏幕的初始化程序

这里将逗号分隔的字串拆成两部分,是为了代码截图的方便(避免截图过宽,使图中文字变小),完全可以将两者合二为一。这里提醒开发者:逗号分隔字串中的前四项将作为“标记”,用于访问数据库中对应的预设项,因此字串内容必须与保存预设项时使用的“标记”保持一致。

进入设置屏幕(SETTING)后,自动打开设置选择框,用户可以直接选择需要设置的项。首先我们要实现对预设项的设置。

二、设置组件的显示与隐藏

当用户从设置选择框中选择了某项后,首先要考虑组件的显示与隐藏。我们将六个设置选项与组件的显示属性整理成表格,如表10- 2所示,以便在编写代码时,不会产生遗漏。

表10- 2 组件的显示与隐藏

表格中共有6行,对应于6种选择,注意观察每一行的内容,我们不难发现,其中有两行的设置是完全相同的,它们是“家庭成员”与“支付方式”,实际上我们只需要设置5种状态;另外,表格提示我们,与显示设置相关的组件共有4个(外加1个对话框),当选择“重置密码”及“恢复默认设置”时,只需要设置两个容器组件的显示属性,对应于2行代码(后者外加弹出对话框);而当选择其他选项时,需要设置4个组件的显示属性,对应于4行代码。这些提示让我们在编写程序时思路清晰,同时也可以帮助我们检查代码中的遗漏。下面我们创建“设置显示状态”过程,利用条件分支语句来处理这五种选择状态,代码如图10-7所示。

图10-7 设置显示状态过程

图中代码包含了三个条件语句,最外层的条件语句包含三个分支,分别对应于恢复默认设置、密码重置及所有预设项;中间层条件语句用于识别“支出二级分类”,最内层的条件语句用于识别“支出专项”,其否则分支对应于“家庭成员”与“支付方式”两项。因此,上述过程完整地处理的用户的每一种设置选择。

三、原始数据的绑定

当用户从设置选择框中选择某一项后,第一项任务是设置组件的显示状态,接下来,第二项任务是原始数据的绑定。所谓数据绑定,是软件开发中的术语,意思是将某些数据与某个组件的属性之间建立起固定的联系,具体到我们的应用中,以支出二级分类为例,当用户选中该项后,我们要从数据库中读取两项数据:支出一级分类与支出二级分类(两者均为列表),并将一级分类下拉框的列表属性设置为支出一级分类(下拉框的默认选中项索引值为1),将设置项下拉框的列表属性设置为支出二级分类(列表)中的第一项。这个过程就称为数据绑定。(有些编程语言中可以实现数据的实时绑定,即,一旦绑定完成,当数据发生变化时,组件的属性值会自动更新,但App Inventor不能做到实时绑定。)

下面我们创建“数据绑定”过程,来实现对下拉框组件数据源的设置,代码如图10-8所示。

图10-8 数据绑定过程

在四个预设项设置中,“家庭成员”与“支付方式”的数据是一级列表,这两项的设置最简单,放在条件语句的否则分支中;“支出专项”的数据是一个三级列表,其中的第2级列表为键值对列表,因此我们需要从中提取“专项名称”作为设置项下拉框列表属性的数据来源;最为复杂的是“支出二级分类”,需要做两次数据绑定操作:分别为一级分类下拉框以及设置项下拉框设置列表属性。

这里需要特别说明一下全局变量“选中项列表”,该列表中保存了某个预设项的全部选项,当用户对预设项进行增删改操作时,实际上是对该列表的操作。每次列表内容更新时,都需要将更新后的数据保存到数据库中。此外,当用户选择不同的设置项时,该列表的数据结构是不同的,数据的具体格式请参见本章第二节的数据模型部分。

四、组件初始化

组件初始化是将有关组件的属性设置恢复到初始状态。在增删改的操作完成之后,我们希望清空预设项输入框,让专项激活复选框不被选中,让保存按钮上的文字显示为“保存”(稍后你会看到这样设置的原因)。代码如图10-9所示。

图10-9 组件初始化过程

五、设置选择框的完成选择事件

有了以上三个过程,我们可以轻松地编写设置选择框的完成选择程序,代码如图10-10所示。

图10-10 设置选择框的完成选择程序

下一步我们将逐项处理原始数据的增删改操作,我们从最复杂的支出二级分类开始。

第六节 设置支出二级分类

一、选择支出一级分类

当用户从设置选择框中选择了“支出二级分类”后,应用会进行数据的绑定,即,为两个下拉框组件设置列表属性,之后用户可以从“一级分类下拉框”中选择一级分类,此时,我们希望“设置项下拉框”中的备选内容自动更新为与一级分类对应的二级分类,为此我们需要借助于一级分类下拉框的完成选择事件,来实现两个下拉框之间的联动,代码如图10-11所示。

图10-11 一级分类的选择引发二级分类的重新绑定

图中的第二行代码用于设置二级分类的选中项。在测试中发现,设置项下拉框的选中项索引值在重新设置组件的列表属性时保持不变,也就是说,如果我们在某个一级分类中选择了二级分类中的第2项,那么当改变一级分类时,设置项下拉框的选中项会变成改变后的二级分类中的第2项。我们不希望出现这种情况,因此,每次选择一级分类后,将选中项索引值设为1。

二、修改二级分类

当用户选择一级分类后,可以继续选择二级分类,此时,要将选中的二级分类填写到“预设项输入框”中,并设保存按钮的显示文本为“修改”。以上操作在设置项下拉框的完成选择事件中实现,代码如图10-12所示,代码的测试结果如图10-13所示。

图10-12 当用户选中某二级分类时
图10-13 测试:当用户选中某二级分类时

此时,用户可以修改输入框内的文字,然后点击“修改”按钮(其实是保存按钮),完成对二级分类的修改,修改操作包含以下5个步骤:

  1. 检查预设项输入框是否为空,如果不为空,执行修改指令,否则提示用户输入预设项内容;
  2. 修改内存中的数据,即,修改全局变量“选中项列表”;
  3. 更新屏幕上的显示数据,即,更新“设置项下拉框”的列表属性;
  4. 将修改的结果保存到数据库中;
  5. 界面组件恢复到初始状态:清空预设项输入框,并设保存按钮的显示文本为“保存”。

以上操作的代码如图10-14所示。

图10-14 修改二级分类

在图10-14中有两个“替换”列表项块,第一个“替换”块用于修改二级分类的选中项,这个块中的第一个参数——局部变量临时列表,取自于设置项下拉框的列表属性(记住:组件的属性等同于全局变量);第二个“替换”块用于更新全局变量“选中项列表”;在完成了全局变量的更新之后,更新“设置项下拉框”的列表属性,最后将更新后的“选中项列表”保存到数据库中。代码的测试结果如图10-15所示。

图10-15 修改二级分类的测试结果

三、删除二级分类

与修改操作一样,如果用户想删除某个二级分类项,首先要选择一级分类,然后选择要删除的二级分类,最后点击删除按钮,即可完成删除操作,代码如图10-16所示。

图10-16 删除二级分类

与修改程序相比,有两点差别:

  1. 修改操作中使用了两个“替换”块,而删除操作中将第一个“替换”块改为“删除”块;
  2. 修改操作中检查的是“预设项输入框是否为空”,而删除操作中检查的是“保存按钮”的显示文本是否为“修改”。

四、新增二级分类

当用户选择了某个一级分类之后,不再选择二级分类,或用户在选择二级分类之后,又点击了新增按钮,则应用处于“新增”状态,此时用户可以在设置项输入框中输入新的二级分类,并点击保存按钮,实现新增操作,代码如图10-17所示。

图10-17 新增支出二级分类

这里还要补充一个新增按钮的点击程序,代码如图10-18所示。

图10-18 新增按钮的点击程序

以上完成了对支出二级分类的增删改操作,读者不妨结合“收入记录”屏幕中的增删改操作,看看有哪些共同之处,并加以总结,以便在未来自己的开发实践中参考借鉴。

五、测试

前面已经完成了修改功能的测试,现在来测试新增及删除功能,新增操作的测试结果如图10-19所示。

图10-19 新增二级分类的测试结果

首先在设置选择框中选择“支出二级分类”,屏幕上显示一级分类与二级分类的下拉框,默认的选中项索引值为1(左一图);打开一级分类下拉框,准备选择其中的第2项“穿戴”(左二图);选中“穿戴”后,设置项下拉框自动更新为穿戴类的二级列表(左三图);在预设项输入框中输入“运动装”,此时保存按钮显示“保存”(右二图);点击保存按钮后,对话框提示新增成功(右一图),证明新增操作已经完成。

删除操作的测试结果如图10-20所示。

图10-20 删除二级分类的测试结果

继图10-19中右一图之后,打开设置项下拉框,可以见到刚刚新增的“运动装”一项,预备选择倒数第2项“饰品”(左一图);选中“饰品”后,“饰品”二字被填写到输入框中,保存按钮显示“修改”(左二图);点击删除按钮后,对话框提示“删除成功”,输入框清空,保存按钮显示“保存”(右二图);打开设置项下拉框,可见之前的“饰品”已然消失。

第七节 设置支出专项

对支出专项的设置也要从“设置选择框”开始,让我们重温一下“设置选择框”的完成选择事件。如图10-10所示,首先调用“设置显示状态”过程,显示或隐藏某些界面组件;然后调用“数据绑定”过程,该过程一方面用全局变量“选中项列表”来保存从数据库中读出的原始数据,另一方面,从原始数据中提取支出专项的名称列表,并将其设为“设置项下拉框”的列表属性,如图10-8所示。此时测试设备上的界面外观如图10-21所示。

图10-21 选择支出专项后的用户界面

一、选中某个支出专项

如图10-12所示,在设置支出二级分类时,我们从设置项下拉框中选择一项,此时二级分类名称将填写到设置项输入框中,同时,保存按钮上的文字改为“修改”。在设置支出专项时,对这一操作的处理变得稍微复杂一些,即,不仅需要填写输入框,还需要设置激活复选框的“选中”属性。为此,我们需要修改“设置项下拉框”的完成选择事件,添加对激活复选框的设置,代码如图10-22所示。

图10-22 填写输入框,并设置激活状态复选框

程序的测试结果如图10-23所示。

图10-23 测试结果

此时,用户可以修改输入框中的内容,或改变激活复选框的选中状态,并点击“修改”按钮(即保存按钮),完成修改操作;也可以直接点击删除按钮,删除该支出专项;或者,用户可以点击“新增”按钮,清空输入框,取消激活复选框的选中状态,为新增操作做准备。

二、新增与修改

我们将一并处理“新增”与“修改”操作,因为它们都与保存按钮的点击事件有关。在保存按钮的点击程序中,要处理四个预设项的保存与修改操作,也就是说,可能存在2x4=8个条件分支,这势必导致该程序的代码过于冗长,为了便于代码的阅读及管理,我们需要为每个预设项的新增及修改操作创建一个过程,在点击保存按钮时,只要在各自的条件分支中调用这些过程即可。

首先从已经完成“支出二级分类”开始,过程名称为“新增修改二级分类”。我们暂时不考虑代码的复用性,把现有的保存按钮点击程序中的部分代码拖出来,直接放到定义过程块中,并在点击程序中调用该过程,代码如图10-24所示。

图10-24 创建过程——新增修改二级分类

同样,我们也要创建一个“新增修改支出专项”过程,我们先来整理一下思路,如图10-25所示。我们将选中项列表的内容以代码块的方式展现出来,这样更易于理解后面的代码。

图10-25 支出专项的数据结构及修改的步骤

鉴于支出专项数据结构的特殊性,我们在编写过程时,先采集界面数据拼成键值对列表,再用键值对列表替换选中项(修改操作),或添加到原始数据中(新增操作);代码如图10-26所示。

图10-26 一并处理支出专项的新增与修改操作

上图中有一块带黄色边框的代码,来自于“数据绑定”过程,它的作用是从更新后的“选中项列表”中提取专项名称,组成专项名称列表中,并将该列表设置为下拉框的列表属性。两段完全相同的代码用在不同的地方,我们有必要将它们封装成过程,并用过程来替换原来的代码。修改过程程序如图10-27所示。

图10-27 将重复的代码封装为过程——名称列表

下一步我们来改造保存按钮的点击程序,在预设项输入框不为空的条件分支中,添加内层条件分支语句,根据“设置选择框的选中项”来决定调用哪一个“新增修改”过程。代码如图10-28所示。

图10-28 在保存按钮点击程序中调用“新增修改”过程

三、删除

下面来处理支出专项的删除操作。在删除按钮的点击事件中,同样要处理对四个选项的删除操作,为了避免代码过于冗长,我们将其中与选项有关的代码独立出来,放在过程里。创建一个“删除二级分类”过程,将此前按钮点击程序中的部分代码封装起来,如图10-29所示。

图10-29 将与选项有关的代码封装成过程,并调用过程

创建“删除支出专项”过程,并在删除按钮点击事件中调用该过程,代码如图10-30所示。

图10-30 创建删除支出专项过程,并在删除按钮点击事件中调用该过程

四、测试

首先测试新增功能,如图10-31所示:在设置选择框中选择“支出专项”,设置项下列框中显示第一条支出专项的名称,保存按钮显示文本为“保存”(左一图);输入“开源教育”并选中激活复选框(左二图);点击保存按钮,保存新增项,对话框显示“新增成功”(右二图);打开设置项下拉框,列表中显示五个专项名称,最后一个是新增项(右一图)。遗憾的是下拉框的标题写错了一个字——“请选择”误写成“清选择”,稍后我们加以改正。

图10-31 新增专项测试

再来测试修改就删除功能,如图10-32所示:选中“攻读博士”专项,此时保存按钮显示“修改”,将“博士”改为“硕士”(左一图);点击“修改”按钮,对话框显示“修改成功”,此时设置项下拉框中显示“攻读硕士”,预设项输入框被清空,激活复选框不被选中,保存按钮的显示“保存”(左二图);打开设置项下拉框,发现最后一项已经修改成功,预备选择“攻读硕士”一项(右二图);此时先选中“攻读硕士”以外的任意一项,再重新打开下拉框,选择“攻读硕士”项,点击删除按钮,对话框显示“删除成功”,设置项下拉框中显示最后一项“自酿酒品”(右一图)。

图10-32 修改及删除专项测试

五、测试中的问题

1、删除操作中的顺序问题

我们来做一项修改,改变“删除支出专项”过程中两个删除列表项语句的顺序:先从局部变量临时列表中删除选中项,然后再从全局变量“选中项列表”中删除选中项,代码如图10-33所示。

图10-33 修改两个删除语句的顺序

在测试时,我们选择删除下拉框中的最后一项,结果在手机及App Inventor编程视图中都出现错误提示,如图10-34所示。

图10-34 两个删除列表项代码块调换位置后,测试结果显示程序运行故障

错误提示的意思是:删除列表项的操作试图从列表中删除索引值为0的列表项,最小的有效索引值为1。从错误信息中我们得知,正在试图执行删除操作的列表是“选中项列表”(其中包含了完整的支出专项信息——专项名称及激活)。这说明第一个删除语句已经执行完毕,问题出在第二个删除语句中。但是当删除的项不是最后一项时,删除操作可以正常执行。我们暂时保留这个疑问,来看另一个测试结果。

2、删除后的选中项问题

在测试过程中发现,删除操作后,从屏幕上观察,设置项选择框的选中项索引值保持不变,或减小1。例如,在图10-32的右二图中,如果删除第3项“自酿酒品”,则下拉框中将显示“攻读硕士”(选中项索引值仍为3);但是如果删除最后一项“攻读硕士”(选中项索引值为4),则下拉框中将显示最后一项“自酿酒品”(选中项索引值为3)。为了搞清楚真相,我们来测试一下删除操作后下拉框的选中项索引值。在“删除支出专项”过程里添加一行代码,如图10-35所示,利用屏幕的标题来显示删除选中项后索引值的变化。测试结果如图10-36所示。

图10-35 测试删除成功后下拉框的选中项索引值
图10-36 测试结果

结论是:当选中项是最后一项时,删除成功后选中项索引值为0;当选中项不是最后一项时,删除成功后,选中项索引值保持不变。也就是说,在删除最后一项后,选中项索引值已经超出了数据源——临时列表的长度,此时,App Inventor会自动将下拉框的选中项索引值设置为0,这个结论也解释了第一个问题中故障的原因——当我们从“临时列表”中删除了最后一项之后,“选中项索引值”被改写为0,当程序继续执行,试图从“选中项列表”中删除索引值为0的列表项时,就发生了图10-34中的错误。

但是为什么屏幕上显示的结果是“不变”和“减1”呢?

3、解释上述疑问

针对第二个问题,我们设计了一个实验,代码如图10-37所示。禁用“删除支出专项”过程中的第三行代码(设下拉框的列表属性为临时列表),然后从设置项下拉框中选择倒数第二项“开源教育”,并点击删除按钮。删除完成后,我们打开手机上的设置项下拉框,发现“开源教育”项并没有消失;此时,我们在编程视图中,右键点击第一行代码中的绿色代码块(设置项下拉框的列表),并选择菜单中最后以行“执行该代码块”,此时该块上自动添加了注释,打开注释窗口,看到了此时此刻下拉框组件的列表属性值——“开源教育”一项已经不见了,如图10-37所示。

图10-37 做一个实验:从下拉框中删除一项后,观察下拉框列表属性的变化

由于我们事先禁用了第3行代码(更新下拉框的列表属性),因此我们可以得出两个结论:①当从临时列表中删除一项后,下拉框的列表属性也会自动更新;②列表属性的更新,并没有导致下拉框显示结果的更新,这说明App Inventor中组件与数据之间的绑定关系并非实时绑定。当我们重新启用图10-37中的禁用代码后,用户界面上下拉框的显示内容会同步更新,说明这个“设置”动作可以引发界面组件显示属性的更新。

我们经常说“从错误中学习,在犯错中成长”,的确,从这个运行故障中,我们了解到了App Inventor中组件属性与数据之间的绑定机制,以及删除下拉框组件的最后一项时,App Inventor对选中项索引值的处理方式,同时,我们也学到了探究程序错误原因的方法。不要小看这些看似琐屑的细节,只有清晰地了解程序的运行机制,才能避开程序的陷阱。

第八节 设置家庭成员及支付方式

一、选择设置项

在第五节“选择设置项”中,我们完成了设置前的准备工作:当用户在设置选择框中选择了“家庭成员”或“支付方式”时(如图10-10),应用首先设置组件的显示与隐藏(如图10-7),其次对“设置项下拉框”进行数据绑定——设下拉框的列表属性为数据库中读取的对应信息(如图10-8)。在数据绑定及初始化完成之后,需要处理“设置项下拉框”的完成选择事件开始(如图10-22)。以上程序同样适用于选中“家庭成员”以及“支付方式”两项的情形。因此,我们接下来只需要处理具体的设置操作——新增、修改及删除。

与前两项设置相比,这两项数据均为一级列表,操作起来相对简单,而且可以一同处理。我们将“家庭成员”与“支付方式”这两项统称为“简单项”。

二、新增与修改简单项

先来处理简单项的新增与修改操作。创建一个过程——新增修改简单项,代码如图10-38所示。

图10-38 一个对“家庭成员”及“支付方式”都适用的过程——新增修改简单项

然后在保存按钮点击事件中调用该过程,代码如图10-39所示。

图10-39 保存按钮点击程序的最终版本

三、删除简单项

同样先创建一个过程——删除简单项,代码如图10-40所示。

图10-40 同时适用于“家庭成员”及“支付方式”的删除过程

然后在删除按钮点击事件中调用该过程,代码如图10-41示。

图10-41 删除按钮点击程序的最终版本

四、测试

我们仅对家庭成员一项进行测试,新增操作的测试结果如图10-42所示。在设置选择框中选中“家庭成员”一项后,打开设置项下拉框,看到其中包含三个系统预设项(左一图);在预设项输入框输入新成员姓名,此时保存按钮上显示“保存”(左二图);点击保存按钮,对话框提示“新增成功”(右二图);打开设置项下拉框,看到列表中新增了一项(右一图)。

图10-42 测试——新增家庭成员
图10-43是修改及删除操作的测试结果。在图10-42的右一图中,选择第2项——李斯,此时保存按钮显示“修改”,将“李斯”改为李思雨(图10-43左一图);点击“修改”按钮,对话框显示“修改成功”,设置项下拉框中的内容也同时更新,保存按钮显示“保存”(左二图);打开设置项下拉框,看到更新之后的家庭成员名单(左三图);从中选择第3项——王小五,“王小五”被填写到输入框中(右二图);点击删除按钮,对话框提示“删除成功”,下拉框中原来的“王小五”变成原来的第4项“张辰亮”。
图10-43 测试——修改、删除家庭成员

至此,系统预设项的设置功能已经全部完成。

第九节 完善新增与修改功能

到目前为止,预设项的设置功能基本上算是完成了,不过就程序逻辑的严谨性而言,其中还有需要改进之处。一个比较严重的问题是,对于修改和新增操作,我们没有考虑到用户输入重复项的问题。现在的设置功能允许用户设置两个同名的预设项,比如在支出专项设置中,允许存在两个甚至更多的“开源教育”专项。为了避免用户输入重复项,我们需要对用户的输入进行检查,这个动作应该在三个“新增修改”过程中完成。首先我们创建一个有返回值的过程——为重复项,来检查用户输入的数据,代码如图10-44所示。

图10-44 检查用户输入的内容是否重复

这里需要小心的是修改操作,用户可能在不作任何修改的情况下,点击“修改”按钮,因此在进行比较时,要排除选中项。

然后在保存按钮的点击程序中调用上述过程,代码如图10-45所示。

图10-45 调用“为重复项”过程

测试结果如图10-46所示,当选中“现金”项时,试图将“现金”改为“转帐”时,应用提示“内容重复,请重新输入”。不过当我错误地将“转帐”写成“转账”时,程序也无能为力!

图10-46 检查重复项的测试结果

第十节 其他设置及返回主菜单

一、密码重置

当用户从设置选择框中选择了密码重置后,将显示密码重置容器,并隐藏预设项容器,这项功能已经在图10-7中完成,这里我们要处理的是对用户输入的原密码及新密码进行检查,检查成功后,将新密码保存到数据库中,代码如图10-47所示。

图10-47 重置密码

在密码保存成功后,用对话框显示操作结果,并初始化密码组件——清空所有密码输入框中的字符,并将错误提示标签的显示文本设为空。此时,用户界面上只剩下光秃秃的几个密码输入框,显得有些突兀,于是我们隐藏了密码重置容器,并打开“设置选择框”,以便用户选择其他的设置项。

这里的密码组件初始化过程看似无用,因为整个密码重置容器隐藏之后,其中的组件也都看不见了。但是,如果不执行初始化过程,当用户再次选择密码重置时,会看到一个凌乱的画面,里面有可能还残留着“原密码错误”一类的提示信息,这会让用户感到困惑,并对应用本身失去信心。

二、恢复默认设置

当用户选择了“恢复默认设置”项时,应用将弹出对话框,代码如图10-7所示,我们将根据用户的选择,执行相应的操作,代码如图10-48所示。

图10-48 恢复默认设置

当用户在对话框中选择了“确定”时,从手机中读取应用的预设项文本文件CATEGORY.txt,当文件管理器收到文本时,对文本内容进行解析,并将解析之后的数据逐一保存到数据库中。上图中文件管理器的收到文本事件处理程序是从第八章复制过来的,一同复制过来的还有下面的“解析支出分类”过程以及“支出专项列表”过程,如图10-49及图10-50所示。

图10-49 从第8章复制过来的“解析支出分类”过程
图10-50 从第8章复制过来的“支出专项列表”过程

三、返回主菜单

当用户点击返回按钮时,关闭当前屏幕,代码如图10-51所示,但该功能的测试无法在AI伴侣中进行,只能最后当项目开发完成时,编译成.apk文件,安装到手机上进行测试。

图10-51 返回主菜单

系统设置功能至此已全部开发完成,下一章将实现支出记录功能。