Проблема, с которой я сталкиваюсь, заключается в том, что мой счетчик переменной «оценка» не может превышать 1 в моей программе. Если пользователь вводит значение, равное отображаемому случайному числу (LoadG1), они получают очко. Затем это выводится в конце, как показано на более длинном таймере. В более коротком таймере добавляется точка. Int-переменная объявляется в начале. Все показано ниже. Теперь я знаю, что это окончательно, и что это, скорее всего, причина моей проблемы, но IDE требует, чтобы она была окончательной, иначе я могу только вызвать переменную «оценка» одним методом (CountDown Timer в моем случае). Это вызывает у меня проблемы. Я намерен добавлять точку каждый раз, когда 4-секундный таймер повторяет, если пользователь имеет правильный вход каждый раз, хотя он не может пройти более 1 на данный момент. Я хотел бы, чтобы окончательный результат был выведен в конце, как показано ниже.Переменная баллов не будет обновляться и должна быть окончательной?
Код:
final int[] score = {0};
final Random generateG1 = new Random();
final int loadG1 = generateG1.nextInt(1000000)+10000;
final TextView number = (TextView) findViewById(R.id.number);
number.setText(" "+loadG1);
final CountDownTimer loop = new CountDownTimer(4000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
number.setVisibility(View.GONE);
final TextView prompt = (TextView) findViewById(R.id.prompt);
prompt.setVisibility(View.VISIBLE);
prompt.setText(" Enter the number");
final EditText input = (EditText) findViewById(R.id.enterAnswer);
input.setVisibility(View.VISIBLE);
input.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_ENTER:
Editable answer = input.getText();
int finalAnswer = Integer.parseInt(String.valueOf(answer));
int finalLoadG1 = Integer.parseInt(String.valueOf(loadG1));
input.setVisibility(View.GONE);
prompt.setVisibility(View.GONE);
if (finalAnswer == finalLoadG1) {
score[0]++;
}
number.setVisibility(View.VISIBLE);
final int loadG1 = generateG1.nextInt(1000000) + 10000;
number.setText(" " + loadG1);
input.getText().clear();
start();
return true;
default:
}
}
return false;
}
});
}
}.start();
new CountDownTimer(24000, 1000) {
@Override
public void onTick (long millisUntilFinished) {
}
@Override
public void onFinish() {
TextView result = (TextView) findViewById(R.id.outcome);
result.setText("Score: "+ score[0]);
TextView prompt = (TextView) findViewById(R.id.prompt);
prompt.setVisibility(View.GONE);
final EditText input = (EditText) findViewById(R.id.enterAnswer);
input.setVisibility(View.GONE);
loop.cancel();
}
}.start();
Я бы очень признателен, если кто-то может предоставить мне с исправлением к моей проблеме, заранее спасибо.
Попробуйте придумать минимальный жизнеспособный пример. Я не знаю, где ваша проблема. Это * fine *, чтобы иметь * final * массив - это просто означает, что * array * сам останется неизменным, но одна запись внутри этого массива все еще может быть обновлена. – GhostCat
Разве вы не можете просто сделать 'score' членом переменной вашего класса? –
Возможный дубликат [Как я могу повторить этот таймер обратного отсчета определенным образом??] (Http://stackoverflow.com/questions/40057754/how-can-i-repeat-this-countdown-timer-in- a-specific-way) – Selvin