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);    }

并在OnCreate函数中通过savedInstanceState.getInt(KEY_INDEX, 0);读取已有问题数组下标。
  • 在跳转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
原创粉丝点击