首页 > 解决方案 > 带有 SQLite 的多项选择测验应用程序(新活动中不显示分数)

问题描述

我是 android 新手,我只是通过观看带有 sqlite 集成系列(Youtube 播放列表)的多项选择测验应用程序来做一个 android 应用程序。现在我有一个问题。在教程中,他们有 2 个活动(主要活动测验活动),并且来自 QuizActivity 的分数被发送回 MainActivity。但我有 3 个活动(主要活动问题活动和结果活动)。我想将分数从 QuestionActivity 发送到 ResultActivity 并用 textView 显示。问题是分数总是显示为 0,但是当我调试时showResult(),分数显示调试结果。你能检查我的编码并为我修复它。我真的是 android 新手,所以请帮助我。

这是调试结果。

调试结果

主要活动

package com.enkoala.enkoala;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

    Button buttonGeneral= findViewById(R.id.button_general_english);
    buttonGeneral.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            GeneralEnglish();
        }
    });
}
private void GeneralEnglish(){
    Intent intent=new Intent(MainActivity.this,QuestionActivity.class);
    startActivity(intent);
}
}

问题活动

package com.enkoala.enkoala;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.ColorStateList;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Collections;
import java.util.List;


public class QuestionActivity extends AppCompatActivity {
public   static final int REQUEST_CODE_QUIZ = 1;

public static final String EXTRA_SCORE="extra_score";


private TextView textViewQuestion;
private TextView textViewQuestionCount;
private RadioGroup radioGroup;
private RadioButton radioButton1;
private RadioButton radioButton2;
private RadioButton radioButton3;
private Button buttonNext;

private ColorStateList textColorDefaultRb;

private List<Question> questionList;

private int questionCounter;
private int questionCountTotal;
private Question currentQuestion;

private int score;
private boolean answered;

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

    textViewQuestion= findViewById(R.id.text_view_question);
    textViewQuestionCount= findViewById(R.id.text_view_question_count);
    radioGroup= findViewById(R.id.radio_group);
    radioButton1= findViewById(R.id.radio_button1);
    radioButton2= findViewById(R.id.radio_button2);
    radioButton3= findViewById(R.id.radio_button3);
    buttonNext= findViewById(R.id.button_next);

    QuizDatabseHelper databseHelper=new QuizDatabseHelper(this);
    questionList=databseHelper.getAllQuestions();
    questionCountTotal=questionList.size();
    Collections.shuffle(questionList);

    showNextQuestion();

    buttonNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (!answered){
                if (radioButton1.isChecked() || radioButton2.isChecked() || radioButton3.isChecked()){
                    checkAnswer();
                }else {
                    Toast.makeText(QuestionActivity.this, "Please select an answer",                                                     Toast.LENGTH_SHORT).show();
                }
            }else {
                showNextQuestion();
            }
        }
    });
    }
    private void showNextQuestion(){
    radioGroup.clearCheck();

    if (questionCounter<questionCountTotal){
        currentQuestion=questionList.get(questionCounter);
        textViewQuestion.setText(currentQuestion.getQuestion());
        radioButton1.setText(currentQuestion.getOption1());
        radioButton2.setText(currentQuestion.getOption2());
        radioButton3.setText(currentQuestion.getOption3());

        questionCounter++;
        textViewQuestionCount.setText("Question: "+ questionCounter + "/" + questionCountTotal);
        answered=false;
        buttonNext.setText("Next");
    }else {
        buttonNext.setText("Get Result");
        showResult();
    }
    }
    public void showResult(){
        Intent resultIntent = new Intent(QuestionActivity.this,ResultActivity.class);
        resultIntent.putExtra(EXTRA_SCORE,score);
        setResult(RESULT_OK,resultIntent);
        startActivityForResult(resultIntent,REQUEST_CODE_QUIZ);
    }


    private void checkAnswer(){
    answered=true;

    RadioButton radioButtonselected=findViewById(radioGroup.getCheckedRadioButtonId());
    int answernumber = radioGroup.indexOfChild(radioButtonselected) + 1;
    if (answernumber == currentQuestion.getAnswernumber()){
        score++;
    }
    showNextQuestion();
    }
}

结果活动

package com.enkoala.enkoala;

import android.content.Intent;
import android.content.SharedPreferences;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import static com.enkoala.enkoala.QuestionActivity.REQUEST_CODE_QUIZ;

public class ResultActivity extends AppCompatActivity {

public static final String SHARED_PREFS = "sharedPrefs";
public static final String KEY_HIGHSCORE = "keyhighscore";
private TextView textViewHighscore;
private int highscore;


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

    textViewHighscore = findViewById(R.id.text_view_score);
    loadHighscore();

    final Button buttonback = findViewById(R.id.button_back);
    buttonback.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            buttonBack();
        }
    });

}

private void buttonBack() {
    Intent intent = new Intent(ResultActivity.this, MainActivity.class);
    startActivity(intent);
}

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE_QUIZ) {
        if (resultCode == RESULT_OK) {
            int score = data.getIntExtra(QuestionActivity.EXTRA_SCORE, 0);
            if (score > highscore) {
                updateHighscore(score);
            }
        }
    }
}

private void loadHighscore() {
    SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
    highscore = sharedPreferences.getInt(KEY_HIGHSCORE, 0);
    textViewHighscore.setText("Your score is " + highscore + " out of 25. ");
}

private void updateHighscore(int highscoreNew) {
    highscore = highscoreNew;
    textViewHighscore.setText("Your score is " + highscore + " out of 25. ");
    SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt(KEY_HIGHSCORE, highscore);
    editor.apply();
}

}

标签: javaandroidsqlite

解决方案


您是否正在尝试调试结果活动?乍一看,您的代码还可以。但我认为你的方法可能有问题onActivityResult(),因为我知道这是一个异步任务。因此,您应该loadHighscore()onActivityResult()收到您的score价值后转入。认为它应该有所帮助。


推荐阅读