《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