GeoQuiz项目总结:
虽然小时候写过日记但博客还是第一次写,没啥经验,就简单看一看吧。
这个项目是根据书上的内容step by step做下来的,说不上什么和别人不同的地方,唯一不同的可能就是会报出一些和别人不一样的错误吧。
首先说一下在做这个项目的过程中不足的地方吧:
做的过程中,对书上的代码有些理解不够,所以在按照书上内容敲得时候会有疑问,速度会比较慢。还是要对多加练习。
遇到问题放着不解决,再遇到还是会抓狂。
忽视挑战练习,只做书上有的代码完成基本要求。
言归正传,总结项目。
项目要求:给出一道道地理知识,用户点击TRUE或者FALSE按钮来回答屏幕上的问题,GeoQuiz即时作出反馈。
涉及的知识点
国际化定义方式:values-语言代号-地区代号,如values-zh-rCN:表示简体中文-中国,创建以此命名的目录,然后在创建相应的资源文件
string.xml用来存储字符串资源,方便实现语言的国际化
Are you sure want to do this? SHOW ANSWER CHEAT! Cheating is wrong. 生命周期的七个方法:onCreate()、onStart()、onRestart()、onResume()(在Activity启动并与用户进行交互时调用此时Activity处于栈的顶部)、OnPause()(出现在一个Activity之上启动带透明背景视图或小于屏幕尺寸视图的新的Activity)、onStop()、onDestory()
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"onCreate(Bundle) called"); //添加日志输出代码 setContentView(R.layout.activity_quiz); ``````` } @Override public void onStart(){ super.onStart(); Log.d(TAG,"onStart() called"); } @Override public void onPause(){ super.onPause(); Log.d(TAG,"onPause() called"); } @Override public void onResume(){ super.onResume(); Log.d(TAG,"onResume() called"); } @Override public void onStop(){ super.onStop(); Log.d(TAG,"onStop() called"); } @Override public void onDestroy(){ super.onDestroy(); Log.d(TAG,"onDestroy() called"); }
当屏幕旋转时,会销毁当前的Activity,重新创建一个新的Activity实例(要保存以前的数据,覆盖onSaveInstanceState(Bundle()方法))
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
Log.i(TAG,"onSaveInstanceState");
savedInstanceState.putInt(KEY_INDEX,mCurrentIndex);
}
Intent
类型:显式Intent:用于启动组件、服务
隐式Intent:指定需要执行的action(Action、Data和Category)
Extras:包含具体用于组建实际处理的数据信息
Flags:Intent的元数据,决定Android对其操作的行为
应用场景
- 传递数据
Intent data= new Intent(); data.putExtra(EXTRA_ANSWER_SHOWN,isAnswerShown);
public static boolean wasAnswerShown(Intent result){ return result.getBooleanExtra(EXTRA_ANSWER_SHOWN,false); }
获取数据
mAnswerIsTrue= getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE,false);
启动第二个Activity
mCheatButton.setOnClickListener(new View.OnClickListener() {//设置监听
@Override
public void onClick(View view) {
/* Intent intent=new Intent(QuizActivity.this, CheatActivity.class); */
boolean answerIsTrue =mQuestionBank[mCurrentIndex].isAnswerTrue();
Intent intent = CheatActivity.newIntent(QuizActivity.this,answerIsTrue);
/* startActivity(intent);*/
startActivityForResult(intent,REQUEST_CODE_CHEAT);
}
});
GeoQuiz页面
上一题与下一题
//返回上一题
mPreButton=(ImageButton) findViewById(R.id.pre_button);
mPreButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCurrentIndex=(mCurrentIndex-1)%mQuestionBank.length;
if(mCurrentIndex == 0) {
Toast.makeText(QuizActivity.this,"这是第一个哦,没有前一个啦!",Toast.LENGTH_SHORT).show();
}
mIsCheater=false;
updateQuestion();
}
});
//下一题
mNextButton=(ImageButton)findViewById(R.id.next_button);//为next按钮设置监听
mNextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCurrentIndex=(mCurrentIndex+1)%mQuestionBank.length;
/* int question=mQuestionBank[mCurrentIndex].getmTextResId();
mQuestionTextView.setText(question);*/
mIsCheater=false;
updateQuestion(); //调用updateQuestion()方法,拿出问题
}
});
当屏幕旋转后
遇到的问题
- 实例化一个数组,匿名类
- 使用匿名类,可以相对集中的实现监听器方法,一眼可见
- 事件监听器一般只在一个地方使用,使用匿名内部类,不应频繁的创建繁琐的匿名类
private Question[] mQuestionBank=new Question[]{
new Question(R.string.question_australia,true),
new Question(R.string.question_oceans,true),//实例化一个数组,匿名类
new Question(R.string.question_mideast,false),
new Question(R.string.question_africa,false),
new Question(R.string.question_americas,true),
new Question(R.string.question_asia,true),
};
- 如果遇到了怎么也解决不了的问题,很烦躁,试试清除缓存文件吧,哈哈哈
第一篇博客就写到这里啦。从开始做这个项目到结束前后断断续续持续了一周左右的时间,从准备写博客到结束也用了三四天左右,其实多数都是准备工作以及不知道怎么下手,总的来说呢,这就是一个血与泪的心酸史啊。不过呢,在写这段话的时候啊,心情轻的要飞上天。
不过呢,不足之处,还是多多谅解啊。