寫在前面:
歡迎所有人給我提出任何意見和建議
請注意每一次的程序都是沒有承接之前的挑戰練習
如果有疑問或者意見的可以在下方評論
謝謝!
下載區
第6章挑戰練習–>Link
後續還有其他方式提供沒有積分的小夥伴下載
第一題:挑戰練習 6.4:報告編譯版本
在GeoQuiz應用的頁面佈局上添加一個TextView組件,向用戶報告設備運行系統的API級別
step 1:添加TextView在ShowAnswer下(activity_cheat.xml)
<TextView
android:id="@+id/show_api_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="14dp"
tools:text=""/>
解釋:不用說,就是加一個文本框,用於顯示API Level
step 2:添加綁定與設置API顯示(CheatActivity.java)
private TextView mApiLevelTV;//別忘了創建
//...
protected void onCreate(Bundle savedInstanceState) {
//...
setContentView(R.layout.activity_cheat);
/*在上面這句後,加入綁定語句,然後設置與顯示字符串*/
mApiLevelTV = (TextView)findViewById(R.id.show_api_level);
CharSequence cs = "API Level " + Build.VERSION.SDK_INT;
mApiLevelTV.setText(cs);
//...
}
解釋:完成了,此處主要了解charSequance 是什麼東西就可以,String也是繼承自CharSequence實現了相關方法,只讀。
結果
在ShowAnswer的按鈕下方顯示了API的版本
第二題:挑戰練習 6.5:限制作弊次數
允許用戶最多作弊3次。記錄用戶偷看答案的次數,在CHEAT按鈕下顯示剩餘的次數。超出後,禁用偷看按鈕。
簡單分析
本題目按照我理解的意思,點擊了show answer
按鈕纔算是偷看了,所以這就有點麻煩,需要數據兩邊傳,從QuizActivity
到CheatActivity
相互傳輸。
思路:QuizActiviity
創建一個記錄顯示答案次數的變量–>傳到CheatActivty
,當用戶點擊了顯示答案,該變量,會減一,–>傳回原本的QuizActivity
,最後更新一下UI,如果次數爲0了說明不能看了。
step 1:加入量(QuizActivity.java和CheatActivity.java)
- 在
QuizActivity.java
和CheatActivity.java
中前面數據創建部分加入兩個量
private static final String EXTRA_CHEAT_CHANCE =
"com.bignerdranch.android.geoquiz.cheat_chance";
//記錄作弊次數
private static int mCheatChance = 3;
step 2: 加入TextView(activity_quiz.xml)
- 在合適的地方加入
TextView
用於顯示剩餘的可以偷看的次數。我放在了nextButton
後面
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_cheat_chance"
android:text=""
/>
step 3:綁定(QuizActivity.java)
此處有錯誤,已經更正
- 控件綁定不用說了吧
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
//下方添加綁定
mCheatChanceTextView = (TextView)findViewById(R.id.show_cheat_chance);
...
}
step 4:傳入數據(QuizActivity.java)
- 將目前數據傳到
CheatActivity.java
中,讓他知道現在的可看次數
mCheatButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
Intent intent = CheatActivity.newIntent(QuizActivity.this, answerIsTrue);
//下方多傳入剩餘可查看答案的次數
intent.putExtra(EXTRA_CHEAT_CHANCE,mCheatChance);
startActivityForResult(intent,REQUEST_CODE_CHEAT);
}
});
step 5:獲取數據,點擊顯示答案後數據改變(CheatAcitivity.java)
- 這邊我已經將
onCreate
的代碼全部貼出,但其實只要增加與mCheatChance
有關的兩句就可以
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cheat);
//下面這句從QuizActivity中獲得可查看答案次數的數據
mCheatChance = getIntent().getIntExtra(EXTRA_CHEAT_CHANCE,3);
mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false);
mAnswerTextView = (TextView)findViewById(R.id.answer_text_view);
mApiLevelTV = (TextView)findViewById(R.id.show_api_level);
CharSequence cs = "API Level " + Build.VERSION.SDK_INT;
mApiLevelTV.setText(cs);
mShowAnswerButton = (Button)findViewById(R.id.show_answer_button);
mShowAnswerButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//每次看過答案就-1
mCheatChance--;
if(mAnswerIsTrue){
mAnswerTextView.setText(R.string.true_button);
}else{
mAnswerTextView.setText(R.string.false_button);
}
setAnswerShownResult(true);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int cx = mShowAnswerButton.getWidth() / 2;
int cy = mShowAnswerButton.getHeight() / 2;
float radius = mShowAnswerButton.getWidth();
Animator anim = ViewAnimationUtils
.createCircularReveal(mShowAnswerButton, cx, cy, radius, 0);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mShowAnswerButton.setVisibility(View.INVISIBLE);
}
});
anim.start();
}else{
mShowAnswerButton.setVisibility(View.INVISIBLE);
}
}
});
}
step 6:數據返回給QuizActivity(CheatActivity.java)
- 利用
setAnswerShownResul
t把mCheatChance
傳回去
private void setAnswerShownResult(boolean isAnswerShown) {
Intent data = new Intent();
data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);
//順便傳一個數回去
data.putExtra(EXTRA_CHEAT_CHANCE, mCheatChance);
setResult(RESULT_OK, data);
}
step 7:QuizActivity接收並且更新(QuizActivity.java)
在onActivityResult
收到返回的數據
@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);
//得到返回數據
mCheatChance = data.getIntExtra(EXTRA_CHEAT_CHANCE,0);
}
}
在onStart裏面更新顯示UI
@Override
public void onStart() {
super.onStart();
//沒有作弊的機會了
if(mCheatChance == 0) {
mCheatButton.setEnabled(false);
mCheatChanceTextView.setText("no chance" + " times left");
}
else{
mCheatChanceTextView.setText(mCheatChance + " time(s) left");
}
Log.d(TAG, "onStart() called");
}