Android编程权威指南3.7挑战练习:禁止一题多答

本文介绍了如何在Android应用中设计Question类,添加一个表示用户是否作答的状态,并确保状态在Activity销毁和重建时得以保留。通过修改按钮行为和onSaveInstanceState/onCreate方法,实现了防止用户一题多答的功能。
摘要由CSDN通过智能技术生成

目标:用户答完某道题,就禁掉那道题对应的按钮,防止用户一题多答。

在此之前,创建一个Question类的时候,已经有了两个属性。

    private int mTextResId;
    private boolean mAnswerTrue;

第一个是这个Question类的文本资源Id
第二个是这个Question类的一种状态答案是否正确

我的目标中需要答完某道题,禁掉这道题对应的按钮,那么Question类中应该有这样一个状态,这个状态描述用户是否作答。因此,在Question类中创造它。(注意boolean的默认值为false)

    //是否已经回答
    private boolean mAnswered;
    //get方法
    public boolean isAnswered() {
        return mAnswered;
    }
	//set方法
    public void setAnswered(boolean answered) {
        mAnswered = answered;
    }

我还要保证这种状态数据在活动被删除之前被保留下来,因为当此活动旋转的时候,有一个删除活动重新创建活动的过程。

@Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        //存储是否作答状态
        boolean answerIsAnswered[] = new boolean[mQuestionBank.length];
        for (int i = 0; i < mQuestionBank.length; i++) {
            answerIsAnswered[i] = mQuestionBank[i].isAnswered();
        }
        outState.putBooleanArray(KEY_ANSWERED, answerIsAnswered);
    }
	private static final String KEY_ANSWERED = "KEY_ANSWERED";
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState != null) {
        	boolean answerIsAnswered[] = savedInstanceState.getBooleanArray(KEY_ANSWERED);
            for (int i = 0; i < mQuestionBank.length; i++) {
                mQuestionBank[i].setAnswered(answerIsAnswered[i]);
            }
        }

想象一下视图,点击一个true或false按钮,无论对错与否再也不能点击这两个按钮,以前代码显示,当点击这两个按钮的时候,都调用checkAnswer()方法,在这个方法里面调用checkIfAnswered()方法,可以保证点击这两个按钮任意一个按钮的时候,都不能再在这个问题中点击这两个按钮。(当然,因为点击了按钮,已经回答了,所以在调用checkIfAnswered()方法之前应修改问题的作答状态为true)

想象一下视图,点击next按钮,进入下一个问题,这时需要让按钮可以使用,则必须在此按钮点击事件中调用checkIfAnswered()方法。

想到这里,我需要做三件事。
1、在此活动中写一个checkIfAnswered()方法,判断是否作答。

	//检查是否作答
    private void checkIfAnswered() {
        boolean answerIsAnswered = mQuestionBank[mCurrentIndex].isAnswered();
        if (answerIsAnswered == true) {
            mTrueButton.setEnabled(false);
            mFalseButton.setEnabled(false);
        } else {
            mTrueButton.setEnabled(true);
            mFalseButton.setEnabled(true);
        }
    }

2、在checkAnswer()方法中调用checkIfAnswered()方法。(当然,因为点击了按钮,已经回答了,所以在调用checkIfAnswered()方法之前应修改问题的作答状态为true)

private void checkAnswer(boolean userPressedTrue) {
		mQuestionBank[mCurrentIndex].setAnswered(true);
        checkIfAnswered();
        }

3、在next按钮点击事件中调用checkIfAnswered()方法。

 mNextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            	checkIfAnswered();
              }
        });

注:自学专用,有问题欢迎一起探讨

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值