After hard work, Challenge 5.5 has finally been conquered. Here is the solution:
package com.bignerdranch.android.geoquiz;
import android.app.Activity; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class QuizActivity extends AppCompatActivity { private static final String TAG = "QuizActivity"; private static final String KEY_INDEX = "index"; private static final String KEY_ANSWERED="answered"; private static final int REQUEST_CODE_CHEAT = 0; private Button mTrueButton; private Button mFalseButton; private Button mNextButton; private Button mCheatButton; private TextView mQuestionTextView; 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) }; private int mCurrentIndex = 0; private boolean mIsCheater; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate(Bundle) called"); setContentView(R.layout.activity_quiz); if (savedInstanceState != null) { mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0); mIsCheater=savedInstanceState.getBoolean(KEY_ANSWERED,false); } mQuestionTextView = (TextView) findViewById(R.id.question_text_view); mTrueButton = (Button) findViewById(R.id.true_button); mTrueButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { checkAnswer(true); } }); mFalseButton = (Button) findViewById(R.id.false_button); mFalseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { checkAnswer(false); } }); mNextButton = (Button) findViewById(R.id.next_button); mNextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length; mIsCheater = false; updateQuestion(); } }); mCheatButton = (Button) findViewById(R.id.cheat_button); mCheatButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Start CheatActivity boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue(); Intent intent = CheatActivity.newIntent(QuizActivity.this, answerIsTrue); startActivityForResult(intent, REQUEST_CODE_CHEAT); } }); updateQuestion(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { return; } if (requestCode == REQUEST_CODE_CHEAT) { if (data == null) { return; } mIsCheater = CheatActivity.wasAnswerShown(data); } } @Override public void onStart() { super.onStart(); Log.d(TAG, "onStart() called"); } @Override public void onResume() { super.onResume(); Log.d(TAG, "onResume() called"); } @Override public void onPause() { super.onPause(); Log.d(TAG, "onPause() called"); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); Log.i(TAG, "onSaveInstanceState"); savedInstanceState.putInt(KEY_INDEX, mCurrentIndex); savedInstanceState.putBoolean(KEY_ANSWERED, mIsCheater); } @Override public void onStop() { super.onStop(); Log.d(TAG, "onStop() called"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy() called"); } private void updateQuestion() { int question = mQuestionBank[mCurrentIndex].getTextResId(); mQuestionTextView.setText(question); } private void checkAnswer(boolean userPressedTrue) { boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue(); int messageResId = 0; if (mIsCheater) { messageResId = R.string.judgment_toast; } else { if (userPressedTrue == answerIsTrue) { messageResId = R.string.correct_toast; } else { messageResId = R.string.incorrect_toast; } } Toast.makeText(this, messageResId, Toast.LENGTH_LONG) .show(); } }
package com.bignerdranch.android.geoquiz;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class CheatActivity extends AppCompatActivity {
private static final String EXTRA_ANSWER_IS_TRUE =
“com.bignerdranch.android.geoquiz.answer_is_true”;
//private static final String EXTRA_ANSWER_SHOWN=
// “com.bignerdranch.android.geoquiz.answer_shown”;
private static final String KEY_ANSWERED=“answered”;
private boolean mAnswerIsTrue;
private TextView mAnswerTextView;
private Button mShowAnswerButton;
private Boolean mWhether=false;
/*;
private boolean mAnswerIsTrue;
*/public static Intent newIntent(Context packageContext, boolean answerIsTrue) { Intent intent = new Intent(packageContext, CheatActivity.class); intent.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue); return intent; } public static boolean wasAnswerShown(Intent result){ return result.getBooleanExtra(KEY_ANSWERED,false); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cheat); mAnswerIsTrue=getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE,false); mAnswerTextView=(TextView)findViewById(R.id.answer_text_view); if (savedInstanceState != null) { mWhether = savedInstanceState.getBoolean(KEY_ANSWERED, false); } mShowAnswerButton=(Button)findViewById(R.id.show_answer_button); mShowAnswerButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ if(mAnswerIsTrue) { mAnswerTextView.setText(R.string.true_button); }else { mAnswerTextView.setText(R.string.false_button); } mWhether=true; setAnswerShownResult(mWhether); } }); setAnswerShownResult(mWhether); } @Override public void onSaveInstanceState(Bundle savedInstanceState){ super.onSaveInstanceState(savedInstanceState); savedInstanceState.putBoolean(KEY_ANSWERED,mWhether); } private void setAnswerShownResult(boolean mIsCheater){ Intent data=new Intent(); //data.putExtra(EXTRA_ANSWER_SHOWN,isAnswerShown); data.putExtra(KEY_ANSWERED,mWhether); setResult(RESULT_OK,data); }
}