Android 实验二:Android MVC模式

前情概要

初学,按照课本案例建立一个简单项目,一个问题,有true和false两个作答按钮,回答后会反馈正确与否

实验内容

  1. 除了课堂上介绍的设置的监听器的方法,还有哪些办法实现按钮的响应?
  2. 增加两个按钮(prev,next)实现问题的遍历。
  3. 问题描述已经分离在资源文件中,如何将answer也分离在资源文件中?
  4. 如果要增加新的问题及其答案,是否需要修改Java代码?能否不修改Java代码,仅修改资源文件就实现增加新的问题。提示:Array类型的资源.
  5. 用户答完某题后,禁掉对应题目的True和False作答按钮,即,一个题目只允许作答一次;
  6. 用户答完全部的题目后,toast消息提示答对题目的百分比评分;

作答

1.除了课堂上介绍的设置的监听器的方法,还有哪些办法实现按钮的响应?
方法一:指定按钮功能

 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:onClick="onClick"
        android:text="Button1"/>
  <Button>
    方法二:自定义事件
      增加onClick()方法,再在onCreate()里调用
      

    public void onClick(View view) {
              switch (view.getId()){
                  case R.id.button1:
                     tst=Toast.makeText(MainActivity.this,"button1",Toast.LENGTH_SHORT);
                      tst.show();
                      break;
                  case R.id.button2:
                     tst=Toast.makeText(MainActivity.this,"button2",Toast.LENGTH_SHORT);
                      tst.show();
                      break;
                  default:break;
       }
  1. 增加两个按钮(prev,next)实现问题的遍历。
//设置next按钮
        mNextButton = (Button) findViewById(R.id.next_button) ;
        mNextButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if(mCurrentIndex<mQuestionBank.length-1)
                    mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
//                int question = mQuestionBank[mCurrentIndex].getTextResId();
//                mQuestionTextView.setText(question) ;
                updateQuestion();
            }
        });
        mPreButton = (Button) findViewById(R.id.pre_button) ;
        mPreButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if(mCurrentIndex>0)
                    mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length;
                updateQuestion();
            }
        });
  1. 问题描述已经分离在资源文件中,如何将answer也分离在资源文件中?
    资源文件中:
<string name="true_answer">true</string>
    <string name="false_answer">false</string>

模型层Question.java:

    private int mTextResId;       //问题文本对应id
    private boolean mAnswerTrue;   //答案
    private int mAnswerId;  //分离在资源文件中答案id

控制层:

private Question[] mQuestionBank = new Question[] {
            /*new Question(R.string.question1, false) ,
            new Question(R.string.question2,true) ,
            new Question(R.string.question3, true),
            new Question(R.string.question4,true)*/
            new Question(R.string.question1, R.string.false_answer) ,
            new Question(R.string.question2,R.string.true_answer) ,
            new Question(R.string.question3, R.string.true_answer),
            new Question(R.string.question4,R.string.true_answer)
    };
    //判断答案对错
    private void checkAnswer(boolean userPressedTrue) {
//        boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
        boolean answerIsTrue=Boolean.parseBoolean(getResources().getString(mQuestionBank[mCurrentIndex].getAnswerId()));
        int messageResId = 0;
        if (userPressedTrue == answerIsTrue)
            messageResId = R.string.correct_toast;
        else {
            messageResId = R.string.incorrect_toast;
        }
        Toast.makeText(this, messageResId,Toast.LENGTH_SHORT).show( );
    }
  1. 如果要增加新的问题及其答案,是否需要修改Java代码?能否不修改Java代码,仅修改资源文件就实现增加新的问题。提示:Array类型的资源.
    array.xml:
<resources>
    <string-array name="questions">
        <item>你是机器人吗?</item>
        <item>陌刀将军是李嗣业吗?</item>
        <item>男生宿舍宿舍是6个人吗?</item>
        <item>真的有人学计算机吗?</item>
    </string-array>
    <string-array name="answers">
        <item>false</item>
        <item>true</item>
        <item>true</item>
        <item>true</item>
    </string-array>
</resources>

模型层Question.java:

  //用于数组
    private String questionString;
    private String answerString;

    public Question(String questionString, String answerString) {
        this.questionString = questionString;
        this.answerString = answerString;
    }

控制层QuizActivity.java:

//初始化问题数组
        Resources res=getResources();
        String[] questions=res.getStringArray(R.array.questions);
        String[] answers=res.getStringArray(R.array.answers);
        int length=questions.length;
        mQuestionBank=new Question[length];
        for(int i=0;i<length;i++){
            mQuestionBank[i]=new Question(questions[i],answers[i]);
        }
  1. 用户答完某题后,禁掉对应题目的True和False作答按钮,即,一个题目只允许作答一次;
    创建一个数组记录问题状态:
    private int[] flag; //答题情况,0未答,1正确,2错误
    按下作答按钮后触发:setEnabled(false)禁用 setEnabled(true)恢复许用
mTrueButton=(Button) findViewById(R.id.true_button);
        mTrueButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
//                Toast.makeText(QuizActivity.this,R.string.correct_toast,Toast.LENGTH_SHORT).show();
                checkAnswer(true);
                if (flag[mCurrentIndex]!=0){        //已答题
                    mTrueButton.setEnabled(false);       //禁掉作答按钮
                    mFalseButton.setEnabled(false);
                }
            }
        });

//判断答案对错
    private void checkAnswer(boolean userPressedTrue) {
        Boolean answerIsTrue=Boolean.parseBoolean(mQuestionBank[mCurrentIndex].getAnswerString());
        int messageResId = 0;
        if (userPressedTrue == answerIsTrue){
            messageResId = R.string.correct_toast;
            flag[mCurrentIndex]=1;
        }
        else {
            messageResId = R.string.incorrect_toast;
            flag[mCurrentIndex]=2;
        }
        Toast.makeText(this, messageResId,Toast.LENGTH_SHORT).show( );
    }
  1. 用户答完全部的题目后,toast消息提示答对题目的百分比评分;
    在判断对错checkAnswer函数里添加
if(mCurrentIndex==mQuestionBank.length-1){  //答题完毕
            double trueNum=0;
            for (int i=0;i<flag.length;i++){
                if(flag[i]==1)
                    trueNum++;
//                System.out.println(trueNum);
            }
            trueNum=trueNum/(mQuestionBank.length*1.0);   //正确率
            NumberFormat format = NumberFormat.getPercentInstance();
            format.setMaximumFractionDigits(2);//设置保留几位小数
            System.out.println("百分比为:"+format.format(trueNum));
            Toast.makeText(this,"正确率:"+format.format(trueNum),Toast.LENGTH_SHORT).show();
        }

全部源码

Question.java

public class Question {
    private int mTextResId;       //问题文本对应id
    private boolean mAnswerTrue;   //答案
    private int mAnswerId;  //分离在资源文件中答案id

    //用于数组
    private String questionString;
    private String answerString;

    public Question(String questionString, String answerString) {
        this.questionString = questionString;
        this.answerString = answerString;
    }

    public Question(int textResId, boolean answerTrue) {
    mTextResId = textResId;
    mAnswerTrue = answerTrue;
    }

    public Question(int textResId, int answerId) {
        mTextResId = textResId;
        mAnswerId = answerId;
    }

    public String getQuestionString() {
        return questionString;
    }

    public void setQuestionString(String questionString) {
        this.questionString = questionString;
    }

    public String getAnswerString() {
        return answerString;
    }

    public void setAnswerString(String answerString) {
        this.answerString = answerString;
    }

    public int getAnswerId() {
        return mAnswerId;
    }

    public void setAnswerId(int answerId) {
        mAnswerId = answerId;
    }

    public int getTextResId() {
        return mTextResId;
    }

    public void setTextResId(int textResId) {
        mTextResId = textResId;
    }

    public boolean isAnswerTrue() {
        return mAnswerTrue;
    }

    public void setAnswerTrue(boolean answerTrue) {
        mAnswerTrue = answerTrue;
    }
}

QuizActivity.java

public class QuizActivity extends AppCompatActivity {

    private Button mTrueButton;
    private Button mFalseButton;
    private Button mNextButton;
    private Button mPreButton;
    private TextView mQuestionTextView;
   /* private Question[] mQuestionBank = new Question[] {
            //问题放在资源文件
            *//*new Question(R.string.question1, false) ,
            new Question(R.string.question2,true) ,
            new Question(R.string.question3, true),
            new Question(R.string.question4,true)*//*
            //问题和答案都在资源文件
            new Question(R.string.question1, R.string.false_answer) ,
            new Question(R.string.question2,R.string.true_answer) ,
            new Question(R.string.question3, R.string.true_answer),
            new Question(R.string.question4,R.string.true_answer)
    };*/
    private Question[] mQuestionBank;
    private int mCurrentIndex = 0;
    private int[] flag;   //答题情况,0未答,1正确,2错误

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);

        //初始化问题数组
        Resources res=getResources();
        String[] questions=res.getStringArray(R.array.questions);
        String[] answers=res.getStringArray(R.array.answers);
        int length=questions.length;
        mQuestionBank=new Question[length];
        for(int i=0;i<length;i++){
            mQuestionBank[i]=new Question(questions[i],answers[i]);
        }
        //初始化答题情况数组
        flag=new int[length];

        //引用文本框,将其设置为问题内容
        mQuestionTextView = (TextView) findViewById(R.id.question_text_view);
//        int question = mQuestionBank[mCurrentIndex].getTextResId();
//        mQuestionTextView.setText(question) ;
        updateQuestion();

        //正确按钮
        mTrueButton=(Button) findViewById(R.id.true_button);
        mTrueButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
//                Toast.makeText(QuizActivity.this,R.string.correct_toast,Toast.LENGTH_SHORT).show();
                checkAnswer(true);
                if (flag[mCurrentIndex]!=0){        //已答题
                    mTrueButton.setEnabled(false);       //禁掉作答按钮
                    mFalseButton.setEnabled(false);
                }
            }
        });
        //错误按钮
        mFalseButton=(Button) findViewById(R.id.false_button);
        mFalseButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
//                Toast.makeText(QuizActivity.this,R.string.incorrect_toast,Toast.LENGTH_SHORT).show();
                checkAnswer(false);
                if (flag[mCurrentIndex]!=0){        //已答题
                    mTrueButton.setEnabled(false);       //禁掉作答按钮
                    mFalseButton.setEnabled(false);
                }
            }
        });
        //设置next按钮
        mNextButton = (Button) findViewById(R.id.next_button) ;
        mNextButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if(mCurrentIndex<mQuestionBank.length-1)
                    mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
//                int question = mQuestionBank[mCurrentIndex].getTextResId();
//                mQuestionTextView.setText(question) ;
                updateQuestion();
                if (flag[mCurrentIndex]==0){   //按钮解禁
                    mTrueButton.setEnabled(true);
                    mFalseButton.setEnabled(true);
                }else{
                    mTrueButton.setEnabled(false);       //禁掉作答按钮
                    mFalseButton.setEnabled(false);
                }
            }
        });
        mPreButton = (Button) findViewById(R.id.pre_button) ;
        mPreButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if(mCurrentIndex>0)
                    mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length;
                updateQuestion();
                if (flag[mCurrentIndex]==0){   //按钮解禁
                    mTrueButton.setEnabled(true);
                    mFalseButton.setEnabled(true);
                }else{
                    mTrueButton.setEnabled(false);       //禁掉作答按钮
                    mFalseButton.setEnabled(false);
                }
            }
        });

    }
    //更新问题
    private void updateQuestion() {
//        int question = mQuestionBank[mCurrentIndex].getTextResId();
        String question=mQuestionBank[mCurrentIndex].getQuestionString();
        mQuestionTextView.setText(question) ;
    }

    //判断答案对错
    private void checkAnswer(boolean userPressedTrue) {
//        boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
//        boolean answerIsTrue=Boolean.parseBoolean(getResources().getString(mQuestionBank[mCurrentIndex].getAnswerId()));
        boolean answerIsTrue=Boolean.parseBoolean(mQuestionBank[mCurrentIndex].getAnswerString());
        int messageResId = 0;
        if (userPressedTrue == answerIsTrue){
            messageResId = R.string.correct_toast;
            flag[mCurrentIndex]=1;   //记录
        }
        else {
            messageResId = R.string.incorrect_toast;
            flag[mCurrentIndex]=2;    //记录
        }
        Toast.makeText(this, messageResId,Toast.LENGTH_SHORT).show( );
        if(mCurrentIndex==mQuestionBank.length-1){  //答题完毕
            double trueNum=0;
            for (int i=0;i<flag.length;i++){
                if(flag[i]==1)
                    trueNum++;
//                System.out.println(trueNum);
            }
            trueNum=trueNum/(mQuestionBank.length*1.0);   //正确率
            NumberFormat format = NumberFormat.getPercentInstance();
            format.setMaximumFractionDigits(2);//设置保留几位小数
            System.out.println("百分比为:"+format.format(trueNum));
            Toast.makeText(this,"正确率:"+format.format(trueNum),Toast.LENGTH_SHORT).show();
        }
    }

activity_quiz.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".QuizActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="24dp"
            android:id="@+id/question_text_view"
            />

        <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:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:layout_weight="1"
                android:text="@string/true_button" />

            <Button
                android:id="@+id/false_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:layout_weight="1"
                android:text="@string/false_button" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/pre_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:text="@string/pre_button"
                android:drawableRight="@drawable/arrow_left"
                android:drawablePadding="4dp"/>
            <Button
                android:id="@+id/next_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:text="@string/next_button"
                android:drawableRight="@drawable/arrow_right"
                android:drawablePadding="4dp"/>
        </LinearLayout>
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

string.xml和array.xml

<resources>
    <string name="app_name">GeoQuiz</string>
    <string name="true_button">正确</string>
    <string name="false_button">错误</string>
<!--    <string name="question_text">你不是机器人?</string>-->
    <string name="question1">你是机器人吗?</string>
    <string name="question2">陌刀将军是李嗣业吗?</string>
    <string name="question3">男生宿舍是6个人吗?</string>
    <string name="question4">真的有人学计算机吗?</string>
    <string name="correct_toast">正确!</string>
    <string name="incorrect_toast">错误!</string>
    <string name="next_button">Next</string>
    <string name="pre_button">Pre</string>
    <string name="true_answer">true</string>
    <string name="false_answer">false</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="questions">
        <item>你是机器人吗?</item>
        <item>陌刀将军是李嗣业吗?</item>
        <item>男生宿舍是6个人吗?</item>
        <item>真的有人学计算机吗?</item>
    </string-array>
    <string-array name="answers">
        <item>false</item>
        <item>true</item>
        <item>true</item>
        <item>true</item>
    </string-array>
</resources>
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值