Android編程權威指南(第三版)第6章挑戰練習

寫在前面:


歡迎所有人給我提出任何意見和建議
請注意每一次的程序都是沒有承接之前的挑戰練習
如果有疑問或者意見的可以在下方評論
謝謝!


下載區
第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.4截圖

第二題:挑戰練習 6.5:限制作弊次數

允許用戶最多作弊3次。記錄用戶偷看答案的次數,在CHEAT按鈕下顯示剩餘的次數。超出後,禁用偷看按鈕。

簡單分析

本題目按照我理解的意思,點擊了show answer按鈕纔算是偷看了,所以這就有點麻煩,需要數據兩邊傳,從QuizActivityCheatActivity相互傳輸。
思路QuizActiviity創建一個記錄顯示答案次數的變量–>傳到CheatActivty,當用戶點擊了顯示答案,該變量,會減一,–>傳回原本的QuizActivity,最後更新一下UI,如果次數爲0了說明不能看了。

step 1:加入量(QuizActivity.java和CheatActivity.java)

  • QuizActivity.javaCheatActivity.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)

  • 利用setAnswerShownResult把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");
    }

結果

挑戰練習6.5截圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章