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)

  • 控件绑定不用说了吧
mCheatChance = getIntent().getIntExtra(EXTRA_CHEAT_CHANCE,3);

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截图

猜你喜欢

转载自blog.csdn.net/lo_heng/article/details/80088514