android开发-常识小测试
来源:互联网 发布:网络工程项目名称 编辑:程序博客网 时间:2024/05/17 01:33
参照《Android编程权威指南》前五章的内容。
1.APP逻辑图
APP包含两个Activity和问题及答案的类AnswerOfQuestion,其中MainActivity呈现问题并提供与用户的交互,如回答正确/错误,选择上一题/下一题,查看答案;通过“查看答案”按钮跳转ShowAnswerActivity,为用户呈现答案。逻辑图如下图:
2.AnswerOfQuestion类
用于存放问题及答案。需要注意的是此处问题不是已String的形式存储,而是将问题存放在values/strings.xml中以R.string.question_01,即int型的id来访问问题。通过Alt + Insert键或Code/Generate快速生成构造函数和get/set函数。代码如下:
<span style="font-size:18px;">public class AnswerOfQuestion { private int mQuestion; private boolean mTrueQuestion; public AnswerOfQuestion(int question, boolean trueQuestion) { mQuestion = question; mTrueQuestion = trueQuestion; } public int getQuestion() { return mQuestion; } public void setQuestion(int question) { mQuestion = question; } public boolean isTrueQuestion() { return mTrueQuestion; } public void setTrueQuestion(boolean trueQuestion) { mTrueQuestion = trueQuestion; }}</span>
3.MainActivity
- 首先申明各控件,并通过findViewById函数找到布局文件上的各控件;将findViewById函数统一写在一个函数中,放在OnCreate函数外,方便阅读。代码如下:
<span style="font-size:18px;">private void findViewById(){ mTrueButton = (Button) findViewById(R.id.true_button); mFalseButton = (Button) findViewById(R.id.false_button); mNextButton = (ImageButton) findViewById(R.id.next_button); mPreviousButton = (ImageButton) findViewById(R.id.previous_button); mQuestionTextView = (TextView) findViewById(R.id.question_textview); mShowAnswerButton = (Button) findViewById(R.id.show_answer_button); }</span>
其中需要注意的是问题和答案数组的创建:此处采用静态文本的方式提供问题和答案。申明并初始化的代码如下:
<span style="font-size:18px;">private AnswerOfQuestion[] mAnswerOfQuestions = new AnswerOfQuestion[]{ new AnswerOfQuestion(R.string.question_01, true), new AnswerOfQuestion(R.string.question_02, false), new AnswerOfQuestion(R.string.question_03, false), new AnswerOfQuestion(R.string.question_04, false), new AnswerOfQuestion(R.string.question_05, false) };</span>
同理,将各控件的setOnClickListener统一写在一个函数中,放在OnCreate函数外,方便阅读。代码如下:
<span style="font-size:18px;">private void setOnClickListener(){ mTrueButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { checkAnswer(true); } }); mFalseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { checkAnswer(false); } }); mShowAnswerButton.setOnClickListener(new View.OnClickListener() { @Override //点击后跳转至ShowAnswerActivity,携带当前问题的答案 public void onClick(View view) { Intent intent = new Intent(MainActivity.this, ShowAnswerActivity.class); intent.putExtra(ANSWER, mAnswerOfQuestions[mCurrentIndex].isTrueQuestion()); startActivityForResult(intent, 0); } }); mQuestionTextView.setOnClickListener(new View.OnClickListener() { @Override //点击问题跳转下一题,效果同点击“下一题”按钮 public void onClick(View view) { mCurrentIndex = (mCurrentIndex + 1) % mAnswerOfQuestions.length; updateQuestion(); } }); mNextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCurrentIndex = (mCurrentIndex + 1) % mAnswerOfQuestions.length; updateQuestion(); } }); mPreviousButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mCurrentIndex > 0) { mCurrentIndex = (mCurrentIndex - 1) % mAnswerOfQuestions.length; updateQuestion(); } } }); }</span>
其中checkAnswer(boolean userAnswer)传入用户的选择,并与答案进行比较。int型的messageResourceId用来存放用户的判断是否正确。代码如下:
private void checkAnswer(boolean userAnswer) { boolean questionAnswer = mAnswerOfQuestions[mCurrentIndex].isTrueQuestion(); if (userAnswer == questionAnswer) { messageResourceId = R.string.true_button; } else { messageResourceId = R.string.false_button; } }
updateQuestion()将问题TextView的字符串更新为下一题/上一题。代码如下:
private void updateQuestion() { int question = mAnswerOfQuestions[mCurrentIndex].getQuestion(); Log.i(MAIN_ACTIVITY, "updateQuestion", new Exception());//抛出异常在CatLog中查看updateQuestion()的调用情况<pre name="code" class="java" style="font-size:18px;"><span style="white-space: pre;"></span>mQuestionTextView.setText(question);}
- 由于此APP未锁定显示方向,所以当屏幕旋转时,MainActivity将被销毁并重建。此时问题也会重新显示为第一个问题,通过OnCreate函数中传入的Bundle保存已有问题数组下标。代码如下:
public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.d(MAIN_ACTIVITY, "OnSaveInstanceState"); outState.putInt(KEY_INDEX, mCurrentIndex); }
- 在跳转ShowAnswerActivity查看答案后,通过intent返回用户已查看答案(即作弊),故用mIsAnswerShown来读取从ShowAnswerActivity传过来的查看答案判断标识。MainActivity中的代码如下:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(data == null){ return; } mIsAnswerShown = data.getBooleanExtra(ShowAnswerActivity.ANSWER_SHOWN, false); }
- 最后为OnCreate函数,代码如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(); setOnClickListener(); if (savedInstanceState != null) { mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0); } mIsAnswerShown = false;//缺省用户未查看答案 updateQuestion(); Log.d(MAIN_ACTIVITY, "onCreate"); }
- 另外,查看答案后在OnStart()函数中设置为跳过原问题,弹出“要记住哦”的Toast,并展示下一题。代码如下:
protected void onStart() { Log.d(MAIN_ACTIVITY, "onStart"); if(mIsAnswerShown){ messageResourceId = R.string.judgement_toast; Toast.makeText(MainActivity.this, messageResourceId, Toast.LENGTH_SHORT).show(); mCurrentIndex = (mCurrentIndex + 1) % mAnswerOfQuestions.length; updateQuestion(); } super.onStart(); }
3.ShowAnswerActivity
当用户在该Activity的布局上点击“查看答案”按钮,APP显示答案并记录用户已查看答案,并将记录的标志传给MainActivity。其中的记录功能单独写为setAnswerShownResult函数,如下:
private void setAnswerShownResult(boolean isAnswerShown){ Intent intent = new Intent(); intent.putExtra(ANSWER_SHOWN, isAnswerShown); setResult(RESULT_OK, intent); //通常来说,参数result code可以是以下两个预定义常量中的任何一个: // Activity.RESULT_OK;值为-1 // Activity.RESULT_CANCELED;值为0 //在没有调用setResult(...)方法的情况下,如果用户单击了后退按钮,父activity则会收到Activity.RESULT_CANCELED的结果代码。 }OnCreate()代码如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_answer); setAnswerShownResult(false);//用户未显示答案时为false Intent intent = getIntent(); mAnswer = intent.getBooleanExtra(MainActivity.ANSWER, false);//获取问题的正确答案 mAnswerTextView = (TextView) findViewById(R.id.answer_text); mShowAnswerButton = (Button) findViewById(R.id.show_answer_button); mShowAnswerButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mAnswer) { mAnswerTextView.setText(R.string.true_button);//显示正确答案 } else{ mAnswerTextView.setText(R.string.false_button);//显示正确答案 } setAnswerShownResult(true);//设置答案已查看的标志 } }); }
1 0
- android开发-常识小测试
- iOS11 开发小常识
- Android 小常识
- Android UI小常识
- Android ListView小常识
- Android Studio小常识
- android小常识
- Android小白常识
- ios开发中的小常识
- android 开发常识
- Android开发常识
- Android开发常识
- Android 开发常识
- android——小常识
- Android,Java编程小常识
- 测试接触电流的一些小常识
- android 小常识(包含一些界面开发的推荐颜色和自定义按钮~)
- android 小常识(包含一些界面开发的推荐颜色和自定义按钮~)
- CentOS编译安装Mysql5.6
- redis的 rdb 和 aof 持久化的区别
- java 三大特性之封装
- IOS 16进制的String串转为十进制数
- HDU 4028 The time of a day
- android开发-常识小测试
- AIM Tech Round 3 (Div. 2) C(贪心)
- Loadrunner 接口测试的两种方法
- 百度加固
- Linux查看程序端口占用情况
- 一个算法问题,现有一千瓶药水,其中九百九十九瓶是完全一样的, 只有一瓶里面是毒药
- JNI常识
- 用户输入不期望的输入
- Leetcode 8 String to Integer (atoi)