2016-10-17 8 views
0

Проблема, с которой я сталкиваюсь, заключается в том, что мой счетчик переменной «оценка» не может превышать 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(); 

Я бы очень признателен, если кто-то может предоставить мне с исправлением к моей проблеме, заранее спасибо.

+1

Попробуйте придумать минимальный жизнеспособный пример. Я не знаю, где ваша проблема. Это * fine *, чтобы иметь * final * массив - это просто означает, что * array * сам останется неизменным, но одна запись внутри этого массива все еще может быть обновлена. – GhostCat

+1

Разве вы не можете просто сделать 'score' членом переменной вашего класса? –

+0

Возможный дубликат [Как я могу повторить этот таймер обратного отсчета определенным образом??] (Http://stackoverflow.com/questions/40057754/how-can-i-repeat-this-countdown-timer-in- a-specific-way) – Selvin

ответ

1

Поскольку вы не читаете случайное значение, которое вы создали, просто первый. Поэтому в первый раз ответ правильный, но в следующий раз, когда вы ответите другим, но if сравнивается с первым генерируемым случайным числом, поэтому он не считается действительным ответом (если вы вводите тот же самый первый номер, сколько раз он будет посчитан). Вы должны читать номер из номера TextEdit каждый раз, так как есть текущий номер.

Так это может быть:

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)); 
         // here we get from text field the current correct value 
         int finalLoadG1 = Integer.parseInt(String.valueOf(number.getText())); 
         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(); 

Кроме того, вы можете (и должны) использовать AtomicInteger вместо int[], методы, которые вы будете заинтересованы в:

int AtomicInteger#get(); 
int AtomicInteger#incrementAndGet() 

Так объявить счет в AtomicInteger нравится:

final AtomicInteger score = new AtomicInteger(); 

то вместо score[0]++; сделать score.incrementAndGet();

тогда, когда вы читаете эти результаты сделать: score.get();

+0

Я изменил ее с вашим предложением. Сначала это не сработало, поэтому я избавился от «пробела» до «loadG1», и теперь он работает. Благодарю. – User44

1

Вы писали final int[] score = {0}; в onCreate?

Попробуйте написать int[] score = {0}; из onCreate как глобальную переменную.