《Android编程权威指南》-读书笔记(四)-GeoQuiz功能扩展

《Android编程权威指南》-读书笔记

-GeoQuiz功能扩展

 

从现在开始,这本书开始扩展应用。在这次扩展中我们将会学习以下知识点:

  • 创建一个新类
  • 更新视图层
  • 更新控制层
  • Git代码的修改和提交
  • Android Studio 在设备中运行该应用
  • 给按钮添加图片资源

 

功能:下图是GeoQuiz应用对象图解。应用的对象按模型、控制器和视图的类别被分为三部分。Android应用是给予模型-控制器-视图(Model-View-Controller,简称MVC)的架构模式进行设计的。

 

 

创建一个类 TrueFalse

这个类定义了2个变量 mQuestion、mTrueQuestion。

mQuestion用来保存地理知识问题支付穿的资源ID。

mTrueQuestion用来确定答案正确与否。

右键->new class 类的名称为TrueFalse。

private int mQuestion;

private boolean mTrueQuestion;

添加2个private 的变量

使用快键 alt+Insert 激活选择Constructor 和 Getter and Setter。

Git操作:

$git add .

$git commit –m "add a new class"

$git push GeoQuiz master

 

提交之后可以查看代码

http://git.oschina.net/canglin/GeoQuiz/commit/eea5ae599c3830daaf49eb6ac380b49a2fc07193

 

 

更新视图层

修改activity_quiz.xml

给TextView添加一个id为@+id/question_text_view,添加一个按钮id为@+id/next_button。

 

更新字符串资源定义(strings.xml)

添加字符串

<string name="next_button">Next</string>

 

更新控制层

首先申明

private Button mNextButton;

private TextView mQuestionTextView;

新增的按钮变量和问题显示空间TextView,然后创建一个TrueFalse的对象数组,因为是例子程序,所以直接给他创建数据。

private TrueFalse[] mQuestionBank = new TrueFalse[]

{

new TrueFalse(R.string.question_oceans,true),

new TrueFalse(R.string.question_mideast,false),

new TrueFalse(R.string.question_africa,false),

new TrueFalse(R.string.question_americas,true),

new TrueFalse(R.string.question_asia,true),

};

这个数据创建在了QuizActivity里面,这里是控制层,在真实的程序里这是不优的行为。

 

初始化第一个问题,在onCreate()中

mQuestionTextView = (TextView)findViewById(R.id.question_text_view);

int question = mQuestionBank[mCurrentIndex].getQuestion();

mQuestionTextView.setText(question);

这段代码首先得到TextView的引用,然后通过setText(资源id),显示问题。资源id为int类型。

添加NextButton

mNextButton = (Button)findViewById(R.id.next_button);

mNextButton.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v){

mCurrentIndex = (mCurrentIndex+1) % mQuestionBank.length;

int question = mQuestionBank[mCurrentIndex].getQuestion();

mQuestionTextView.setText(question);

}

});

这段代码首先得到NextButton的引用,然后给它绑定click事件,每点击一次更换一次问题,然后得到这个新问题的资源id,在通过setText(资源id)来刷新问题。

 

到这里功能已经能做到每次点击Next就会换一个问题,效果如下:

点击NEXT后:

我们提交一次代码,这次代码中修改了资源文件,修改了交互界面,修改了交互代码。

Git操作如下:

在工作目录下右键 Git Bush

$git status

$git add .

$git status

首先提交修改

$git commit –m "Add a new button,adds several new issues,adds a new button event"

然后提交到git.oschina.net

$git push GeoQuiz master

代码的修改情况如下

http://git.oschina.net/canglin/GeoQuiz/commit/6be7ee83e2a92f11fd3e4c73072c0e2ef191b162

 

 

代码的重构

在更新mQuestionTextView变量的代码分布在了不同的地方。书中指引我们做了第一次简单的重构,将处理的弓弓代码放在了单独的私有方法里面。

private void updateQuestion(){

int question = mQuestionBank[mCurrentIndex].getQuestion();

mQuestionTextView.setText(question);

}

添加私有方法updateQuestion然后替换掉重复的地方。

Git操作

$git status

$git add .

$git commit –m "refactoring code"

$git push GeoQuiz master

重构后代码如下:

http://git.oschina.net/canglin/GeoQuiz/commit/0fcfdcf2fa5e699ebf2e145ed9d468c3f9d28599

 

验证问题的正确性

创建一个私有的方法checkAnswer()

private void checkAnswer(boolean userPresedTrue) {

boolean answerIsTrue = mQuestionBank[mCurrentIndex].isTrueQuestion();

int messageResId = 0;

if(userPresedTrue == answerIsTrue) {

messageResId = R.string.correct_toast;

} else {

messageResId = R.string.incorrect_toast;

}

Toast.makeText(this,messageResId,Toast.LENGTH_SHORT).show();

}

用此方法替换掉true_button,false_button里面的事件代码。代码如下:

http://git.oschina.net/canglin/GeoQuiz/commit/03989c691e966b1b5d79975993ed114722cb1365

实现此功能后,如果一个错误的答案你选择了TRUE后,会提示incorect。如下图所示:

 

Android Studio在设备中运行该应用

点击 Run->Edit Configurations…

在Target Device 里面勾选USB device(默认的是Show chooser diaglog)。

点击确定。然后Run->Run 'app'

 

给按钮添加图片资源

随便找一个图片arrow_right.png 修改next button的代码如下:

<Button

android:id="@+id/next_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/next_button"

android:drawableRight="@drawable/arrow_right"/>

显示效果如下:

在git中提交代码

http://git.oschina.net/canglin/GeoQuiz/commit/eea0734423d7c2bee60d74430b0a26904a3ce61c

posted @ 2015-03-13 15:30  苍林  阅读(1136)  评论(0编辑  收藏  举报