• 第 2 章 Android 与 MVC 设计模式


    请参考教材,全面理解和完成本章节内容... ...

    复制第一章的ch1工程,将工程目录改名为ch2。

    本章我们将对GeoQuiz App进行功能升级,让应用能够提供更多的地理知识测试题目,如图2-1所示。

    image

    图2-1 更多测试题目

    2.1 创建新类

    在项目导航视图中,展开appjava目录,右键单击com.jet.geoquiz类包,选择New->Class菜单项,弹出图2-2所示的对话框。类名处填入Question,然后单击OK按钮。

    image

    图2-2 创建Question类

    在Question.java中,新增两个成员变量和一个构造方法,如代码清单2-1所示。

    代码清单2-1 Question类中的新增代码(Question.java)

    image

    新增的两个变量需要getter与setter方法。为避免手工输入,可设置由Android Studio自动生成getter与setter方法。

    Check Point

    2.1新增的两个变量为什么需要getter与setter方法

    答:在java中经常是声明一个私有的变量,然后给出他们的公共的gettersetter方法,用于获取和设置变量的值,这样做的好处是什么?好处是实现数据的隐藏和封装,利用setget 方法提供类与外部的接口,这是一种编码标准和良好的编程习惯。

    生成gettersetter方法

    首先,置Android Studio识别成员变量的m前缀和s前缀。

    选择File -> Settings菜单,打开Settings窗口;展开Editor->Code Style -> java,选择Code Generation栏。

    在Code Generation栏中,参考图2-3,增加m作为fields的前缀。然后增加s作为Static Fields的前缀。(GeoQuiz项目不会用到s前缀,但在之后的项目中会用到。)单击OK按钮,如图2-3所示。

    image

    图2-3 设置Java代码风格首选项

    问: 刚才设置的前缀有何作用?

    答: 帮助Android Studio识别成员变量的前缀 (如m),当要求Android Studio为成员变量mTextResId生成getter方法时,它生成的是getTextResId (),而不是getmTextResId ()方法.

    回到Question.java中,右击构造方法下方,选择Generate –>Getters And Setters菜单项,选中为mTextResIdmAnswerTrue变量,点击「OK」按钮生成getter与setter方法,如图2-3-1所示:

    image

    图2-3-1 生成getter与setter方法

    Android Studio为成员变量生成getter与setter方法如代码清单2-2所示。

    代码清单2-2 生成getter与setter方法(Question.java)

    image

    这样Question类就完成了。

    2.2  Android 与 MVC 设计模式

    请参考教材,理解和完成本节内容... ...。

    2.3 更新视图层

    了解了MVC设计模式后,现在我们来更新GeoQuiz应用的视图层,为其添加一个「下一个」按钮。

    打开activity_quiz.xml文件中,参照代码清单2-3完成XML文件的相应修改。

    代码清单2-3 新增按钮以及文本视图的调整(activity_quiz.xml)

    image

    保存activity_quiz.xml文件。这时,可能会得到一个熟悉的红色错误提示,提醒我们缺少字符串资源。

    返回到app esvaluesstrings.xml文件中。删除硬编码的问题字符串,添加新按钮所需的字符串资源定义,如代码清单2-4所示。

    代码清单2-4 更新字符串资源定义(strings.xml)

     image

    保持strings.xml文件处于打开状态,添加向用户显示的一系列地理知识问题的字符串,如代码清单2-5所示。

    代码清单2-5 新增问题字符串(strings.xml)

     image

    保存修改过的文件。然后回到activity_quiz.xml文件中, 在UI设计区里预览确认修改后的布局文件。

    至此,GeoQuiz应用视图层的操作就全部完成了。接下来,我们对控制层的QuizActivity类进行代码编写与资源引用,从而最终完成GeoQuiz应用。

    2.4 更新控制层

    打开QuizActivity.java文件,添加TextView和新的Button变量。另外,再创建一个TrueFalse对象数组以及一个该数组的索引变量,如代码清单2-6所示。

    代码清单2-6 增加按钮变量及TrueFalse对象数组(QuizActivity.java)

     image

    这里,我们通过多次调用Question类的构造方法,创建了一个Question对象数组。

    通过使用mQuestionBank数组、mCurrentIndex变量以及Question对象的存取方法,从而把一系列题目显示在屏幕上。

    首先,引用TextView,并将其文本内容设置为当前数组索引所指向的题目,如代码清单2-7所示。

    代码清单2-7 使用TextView(QuizActivity.java)

    image

    现在来处理「下一个」按钮。首先引用「下一个」按钮,然后为其设置监听器View.OnClickListener。该监听器的作用是:递增数组索引并更新显示TextView的文本内容。如代码清单2-8所示。

    代码清单2-8 使用新增按钮(QuizActivity.java)

    image

    我们发现,用来更新mQuestionTextView变量的相同代码分布在了两个不同的地方。参照代码清单2-9,花点时间把公共代码放在单独的私有方法里。然后在mNextButton监听器里以及onCreate(Bundle)方法的末尾分别调用该方法,从而初步设置activity视图中的文本。

    代码清单2-9 使用updateQuestion()封装公共代码(QuizActivity.java)

    image

    现在,运行GeoQuiz应用验证新增的「下一个」按钮。

    接下来,我们开始处理问题答案的显示。同样,为避免重复的代码块,我们将它们封装在一个私有方法里以供调用。

    要添加到QuizActivity类的方法如下:

    private void checkAnswer(boolean userPressedTrue)

    该方法接受boolean类型的变量参数,可用于判别用户单击了True还是False按钮。

    然后,将用户的答案同当前Question对象中的答案作比较。最后,根据答案的正确与否,生成一个Toast向用户提示反馈消息。

    在QuizActivity.java文件中,添加checkAnswer(boolean)方法的实现代码,如代码清单2-10所示。

    代码清单2-10 增加方法checkAnswer(boolean)(QuizActivity.java)

     image

    在按钮的监听器里,调用checkAnswer(boolean)方法,如代码清单2-11所示。

    代码清单2-11 调用方法checkAnswer(boolean)(QuizActivity.java)

     image

    GeoQuiz应用已经为再次运行做好准备了,接下来让我们在真实设备上运行一下吧。

    2.5 在设备上运行应用

    在硬件设备上运行GeoQuiz应用,会减轻你的电脑负担,而且会更加直观。

    建议你直接搜索如何连接的手机,如“红米怎么打开USB调试”或“华为荣耀3C开发人员选项“

    2.6 添加图标资源

    GeoQuiz应用现在已经能正常运行了。假如Next按钮上能够显示向右的图标, 用户界面看起来应该会更美。

    下载箭头图标文件后,找到mipmap-hdpi、mipmap-mdpi、 mipmap-xhdpi和mipmap-xxhdpi四个目录。

    每个目录下,可看到名为arrow_right.png和arrow_left.png的两个图片文件。这些图片文件都是按照目录名对应的dpi进行定制的。

    2.6.1 向项目中添加资源

    接下来,需将图片文件添加到GeoQuiz项目资源中去。在项目导航视图中,打开res目录,找到匹配各类像素密度的子目录,如图2-7所示。

    image

    图2-7 GeoQuiz应用mipmap目录中的箭头图标

    然后,将已下载文件目录中对应的图片文件复制到项目的对应目录中。

    向应用里添加图片就这么简单。任何添加到resmipmap目录中,后缀名为.png、.jpg或者.gif的文件都会被自动赋予资源ID。(注意,文件名必须是小写字母且不能有任何空格符号。)

    2.6.2 在XML文件中引用资源

    在代码中,可以使用资源ID引用资源。但如果想在布局定义中配置Next按钮显示箭头图标的话,又要如何在布局XML文件中引用资源呢?

    语法只是稍有不同。打开activity_quiz.xml文件,为Button组件新增两个属性,如代码清单2-12所示。

    代码清单2-12 为Next按钮增加图标(activity_quiz.xml)

     image

    在XML资源文件中,通过资源类型和资源名称,可引用其他资源。以@string/开头的定义是引用字符串资源。以 @mipmap/开头的定义是引用mipmap资源。

    从第3章起,我们会学到更多资源命名以及res目录结构中其他资源的使用等相关知识。

    运行QeoQuiz应用。新按钮很漂亮吧?测试一下,确认它仍然正常工作。

    然而,GeoQuiz应用有个bug。GeoQuiz应用运行时,单击「下一个」按钮显示下一道题。然后旋转设备。

    我们发现,设备旋转后应用又显示了第一道测试题。怎么回事?如何修正?

    要解决此类问题,需了解activity生命周期的概念。第3章将会做专题介绍。

  • 相关阅读:
    Linq-单条数据删除
    斐波那契额数列及青蛙跳台阶问题
    旋转数组的最小数字
    扑克牌的顺子
    qsort(),sort()排序函数
    从尾到头打印链表
    查找链表中倒数第k个结点
    左旋转字符串
    数组前半部分和后半部分有序的全排序
    二元树中和为某一值的所有路径
  • 原文地址:https://www.cnblogs.com/jlxuqiang/p/4749435.html
Copyright © 2020-2023  润新知