5.1Android程式設計權威指南(第3版)————第五章程式碼
阿新 • • 發佈:2018-12-19
activity_quiz.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context="com.study.android.geoquizactivity.QuizActivity"> <TextView android:id="@+id/question_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="10dp" android:text="@string/question_australia"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/true_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/true_button"/> <Button android:id="@+id/false_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/false_button"/> </LinearLayout> <Button android:id="@+id/cheat_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cheat_button"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:id="@+id/front_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@drawable/arrow_left" android:text="@string/Front_button"/> <Button android:id="@+id/next_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableRight="@drawable/arrow_right" android:text="@string/next_button"/> </LinearLayout> </LinearLayout>
layout-land資料夾下的activity_quiz.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context="com.study.android.geoquizactivity.QuizActivity"> <TextView android:id="@+id/question_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="10dp" android:layout_gravity="center_horizontal" android:text="@string/question_australia"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="horizontal"> <Button android:id="@+id/true_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/true_button"/> <Button android:id="@+id/false_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/false_button"/> </LinearLayout> <Button android:id="@+id/cheat_button" android:layout_gravity="center" android:layout_marginTop="50dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cheat_button"/> <Button android:id="@+id/next_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:drawableRight="@drawable/arrow_right" android:text="@string/next_button"/> </FrameLayout>
QuizActivity.java
package com.study.android.geoquizactivity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; 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 EXTRA_ANSWER_SHOWN = "com.bignerdranch.android.geoquiz.answer_shown"; private static final int REQUEST_CODE_CHEAT = 0; private Button mTrueButton; private Button mFalseButton; 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 TextView mQuestionTextView; private int mCurrentIndex; private Button mNextButton; private Button mCheatButton; private boolean mIsCheater; private static final String KEY_ANSWERISTRUE = "key_answeristrue"; private static final String EXTRA_ANSWER_CURRENT = "extra_answer_current"; private boolean[] isRecordCheatArray; private int mIsRecordCheat; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_quiz); if (savedInstanceState != null) { mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0); mIsCheater = savedInstanceState.getBoolean(KEY_ANSWERISTRUE); } initView(); initData(); initEvent(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(KEY_INDEX, mCurrentIndex); outState.putBoolean(KEY_ANSWERISTRUE, mQuestionBank[mCurrentIndex].isAnswerTrue()); } private void initData() { isRecordCheatArray = new boolean[mQuestionBank.length]; for (int i = 0; i < mQuestionBank.length; i++) { isRecordCheatArray[i] = false; } } private void initView() { //例項化控制元件 mTrueButton = findViewById(R.id.true_button); mFalseButton = findViewById(R.id.false_button); mNextButton = findViewById(R.id.next_button); mCheatButton = findViewById(R.id.cheat_button); mQuestionTextView = findViewById(R.id.question_text_view); mQuestionTextView.setText(mQuestionBank[mCurrentIndex].getTextResId()); } private void initEvent() { //設定匿名內部類監聽器 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); } }); mNextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mIsCheater = false; mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length; mQuestionTextView.setText(mQuestionBank[mCurrentIndex].getTextResId()); } }); mQuestionTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length; mQuestionTextView.setText(mQuestionBank[mCurrentIndex].getTextResId()); } }); mCheatButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { boolean answerTrue = mQuestionBank[mCurrentIndex].isAnswerTrue(); Intent intent = CheatActivity.newIntent(QuizActivity.this, answerTrue, mCurrentIndex); /*activity呼叫startActivity(Intent)方法時,調 用請求實際發給了作業系統。 準確地說,呼叫請求傳送給了作業系統的ActivityManager。ActivityManager負責建立 Activity例項並呼叫其onCreate(Bundle)方法*/ startActivityForResult(intent, REQUEST_CODE_CHEAT); } }); } /** * 將使用者輸入的結果與正確結果進行對比 * * @param userPressedTrue 使用者輸入的答案 */ public void checkAnswer(boolean userPressedTrue) { boolean correctAnswer = mQuestionBank[mCurrentIndex].isAnswerTrue(); int messageResId = 0; if (mIsCheater || isRecordCheatArray[mCurrentIndex]) { messageResId = R.string.jaugment_toast; } else { if (userPressedTrue == correctAnswer) { messageResId = R.string.correct_toast; } else { messageResId = R.string.incorrect_toast; } } Toast.makeText(QuizActivity.this, messageResId, Toast.LENGTH_SHORT).show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { return; } if (requestCode == REQUEST_CODE_CHEAT) { if (data == null) { return; } mIsCheater = wasAnswerShown(data); mIsRecordCheat = data.getIntExtra(EXTRA_ANSWER_CURRENT, 0); isRecordCheatArray[mIsRecordCheat] = true; } } public boolean wasAnswerShown(Intent result) { return result.getBooleanExtra(EXTRA_ANSWER_SHOWN, false); } }
activity_cheat.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context="com.study.android.geoquizactivity.CheatActivity">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="24dp"
android:text="@string/warn_text"/>
<TextView
android:id="@+id/answer_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="24dp"
tools:text="Answer"/>
<Button
android:id="@+id/show_answer_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/show_answer_button"/>
</LinearLayout>
CheatActivity.java
package com.study.android.geoquizactivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
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_ANSWERISTRUE = "key_answeristrue";
private static final String EXTRA_ANSWER_CURRENT = "extra_answer_current";
private boolean mAnswerIsTrue;
private TextView mAnswerTextView;
private Button mShowAnswerButton;
public static Intent newIntent(Context packageContext, boolean answerIsTrue, int current) {
Intent intent = new Intent(packageContext, CheatActivity.class);
intent.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue);
intent.putExtra(EXTRA_ANSWER_CURRENT, current);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cheat);
mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, true);
if (savedInstanceState != null) {
mAnswerIsTrue = savedInstanceState.getBoolean(KEY_ANSWERISTRUE);
}
mAnswerTextView = findViewById(R.id.answer_text_view);
mShowAnswerButton = findViewById(R.id.show_answer_button);
mShowAnswerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mAnswerIsTrue) {
mAnswerTextView.setText(R.string.true_button);
} else {
mAnswerTextView.setText(R.string.false_button);
}
setAnswerShownResult(true);
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(KEY_ANSWERISTRUE, mAnswerIsTrue);
}
private void setAnswerShownResult(boolean isAnswerShown) {
Intent data = new Intent();
data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);
setResult(RESULT_OK, data);
}
}
Question.java
public class Question {
//題目,因為題目是strings中的,可以直接引用,所以定義為int,而不是String
private int mTextResId;
//問題的答案
private boolean mAnswerTrue;
public Question(int textResId, boolean answerTrue) {
mTextResId = textResId;
mAnswerTrue = answerTrue;
}
public int getTextResId() {
return mTextResId;
}
public Question setTextResId(int textResId) {
mTextResId = textResId;
return this;
}
public boolean isAnswerTrue() {
return mAnswerTrue;
}
public Question setAnswerTrue(boolean answerTrue) {
mAnswerTrue = answerTrue;
return this;
}
}
PS:該Dem有一個缺陷 在橫豎屏切換時 會產生閃退的情況
Demo下載地址:
https://download.csdn.net/download/weixin_43953649/10857996