I am creating a mathematical Quiz, that has 10 questions, all randomly generated, completely. For some reason, when I click on the level I wish to play, it crashes.
No errors are shown in logcat annoyingly.
This is the class that should be executed when a level is chosen:
package com.georgeashby11221.arithmeticquiz;
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Random;
public class GameActivity extends Activity {
TextView txtTimer, txtQuestion;
EditText fldAnswer;
Button submitAnswer;
Boolean questionAnswered = false;
String currentQuestion;
Integer currentAnswer = -1;
Boolean timerActive = false;
HashMap<String, Integer> levelTimes = new HashMap<>();
CountDownTimer countDownTimer;
Integer timeLeftInMilliseconds;
String levelSelected;
Integer userAnswer;
Integer userScore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
txtTimer = findViewById(R.id.txtTimer);
txtQuestion = findViewById(R.id.txtQuestion);
fldAnswer = findViewById(R.id.fldAnswer);
submitAnswer = findViewById(R.id.btnSubmit);
submitAnswer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!(fldAnswer.getText().toString().contains("."))) {
userAnswer = Integer.parseInt(fldAnswer.getText().toString());
questionAnswered = true;
}
}
});
levelTimes.put("1", 20);
levelTimes.put("2", 10);
Bundle extras = getIntent().getExtras();
if (extras != null) {
levelSelected = extras.getString("levelSelected");
}
updateQuestion();
}
public void startStop() {
if (timerActive) {
stopTimer();
} else {
startTimer();
}
}
public void startTimer() {
if(levelSelected != null && levelSelected != "0"&& levelTimes.get(levelSelected) != null) {
timeLeftInMilliseconds = levelTimes.get(levelSelected) * 1000;
timerActive = true;
countDownTimer = new CountDownTimer(timeLeftInMilliseconds, 1000) {
@Override
public void onTick(long millisUntilFinished) {
timeLeftInMilliseconds = Integer.parseInt(String.valueOf(millisUntilFinished));
txtTimer.setText(String.valueOf(timeLeftInMilliseconds / 1000));
}
@Override
public void onFinish() {
timerActive = false;
}
}.start();
}
}
public void stopTimer() {
countDownTimer.cancel();
timerActive = false;
}
public int getRandomIntegerBetweenRange(Integer min, Integer max){
Integer random = new Random().nextInt((max - min) + 1) + min;
return random;
}
public void randomQuestion() {
Integer randomOperator = 1;
Integer first = 0;
Integer second = 0;
switch (randomOperator) {
case 1:
first = getRandomIntegerBetweenRange(1, 12);
second = getRandomIntegerBetweenRange(1, 12);
currentQuestion = (first + " + " + second + " = ?");
currentAnswer = (first + second);
break;
case 2:
currentAnswer = -1;
while (currentAnswer < 0) {
first = getRandomIntegerBetweenRange(1, 12);
second = getRandomIntegerBetweenRange(1, 12);
if((first - second) > 0) {
currentQuestion = (first + " - " + second + " = ?");
currentAnswer = first + second;
break;
}
}
case 3:
first = getRandomIntegerBetweenRange(1, 12);
second = getRandomIntegerBetweenRange(1, 12);
currentQuestion = (first + " * " + second + " = ?");
currentAnswer = first + second;
break;
case 4:
Boolean isDivisible = false;
while (isDivisible == false) {
first = getRandomIntegerBetweenRange(1, 12);
second = getRandomIntegerBetweenRange(1, 12);
if((first % second) == 0) {
currentQuestion = (first + " / " + second + " = ?");
currentAnswer = first + second;
isDivisible = true;
break;
}
}
}
}
public void updateQuestion() {
for(int i = 1; i <=10; i++) {
randomQuestion();
txtQuestion.setText(currentQuestion);
if (levelSelected != "0") {
startStop();
}
while (checkAnswer() == "wait") {
checkAnswer();
}
}
}
public String checkAnswer() {
if(questionAnswered == true) {
if(userAnswer == currentAnswer) {
return "correct";
} else {
return "incorrect";
}
} else {
return "wait";
}
}
}
And this is my Level Selection java class:
package com.georgeashby11221.arithmeticquiz;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;
public class LevelSelectionActivity extends Activity implements View.OnClickListener {
Button levelZero, levelOne, levelTwo, mainMenu;
ImageButton levelZeroInfo, levelOneInfo, levelTwoInfo;
String levelSelected;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_levelselection);
// Registering and Assigning Buttons
levelZero = findViewById(R.id.btnLevelZero);
levelOne = findViewById(R.id.btnLevelOne);
levelTwo = findViewById(R.id.btnLevelTwo);
mainMenu = findViewById(R.id.btnMainScreen);
levelZeroInfo = findViewById(R.id.imgBtnLevelZeroInfo);
levelOneInfo = findViewById(R.id.imgBtnLevelOneInfo);
levelTwoInfo = findViewById(R.id.imgBtnLevelTwoInfo);
levelZero.setOnClickListener(this);
levelOne.setOnClickListener(this);
levelTwo.setOnClickListener(this);
mainMenu.setOnClickListener(this);
levelZeroInfo.setOnClickListener(this);
levelOneInfo.setOnClickListener(this);
levelTwoInfo.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent screen = new Intent(LevelSelectionActivity.this, GameActivity.class);
switch (v.getId()) {
case R.id.btnLevelZero:
levelSelected = "0";
screen.putExtra("levelSelected", levelSelected);
startActivity(screen);
break;
case R.id.btnLevelOne:
levelSelected = "1";
screen.putExtra("levelSelected", levelSelected);
startActivity(screen);
break;
case R.id.btnLevelTwo:
levelSelected = "2";
screen.putExtra("levelSelected", levelSelected);
startActivity(screen);
break;
case R.id.btnMainScreen:
Intent mainMenu = new Intent(LevelSelectionActivity.this, MainActivity.class);
startActivity(mainMenu);
break;
case R.id.imgBtnLevelZeroInfo:
Toast.makeText(getApplicationContext(), "Level 0 has no time limit, reccomended for beginners!", Toast.LENGTH_SHORT).show();
break;
case R.id.imgBtnLevelOneInfo:
Toast.makeText(getApplicationContext(), "Level 1 has a time limit of 20 seconds, reccomended for novices!", Toast.LENGTH_SHORT).show();
break;
case R.id.imgBtnLevelTwoInfo:
Toast.makeText(getApplicationContext(), "Level 2 has a time limit of 10 seconds, reccomended for experts!", Toast.LENGTH_SHORT).show();
break;
}
}
}