Pergunta

Para a minha aplicação Android há um temporizador que mede quanto tempo passou. Sempre 100 milissegundos atualizar meu TextView com algum texto como "Score: 10 Time: 100,10 segundos". Mas, acho que o TextView só atualiza as primeiras vezes. O aplicativo ainda é muito sensível, mas o rótulo não irá atualizar. Tentei ligar .invalidate (), mas ainda não funciona. Eu não sei se há alguma maneira de corrigir isso, ou melhor widget para uso.

Aqui está um exemplo do meu código:

float seconds;
java.util.Timer gametimer;
void updatecount() { TextView t = (TextView)findViewById(R.id.topscore);
t.setText("Score: 10 - Time: "+seconds+" seconds");
t.postInvalidate();
}
public void onCreate(Bundle sis) {
... Load the UI, etc...
  gametimer.schedule(new TimerTask() { public void run() {
     seconds+=0.1; updatecount();
} }, 100, 100);
}
Foi útil?

Solução

A solução geral é usar android.os.Handler vez que é executado no segmento. Ele só faz chamadas de retorno one-shot, então você tem que provocá-lo novamente a cada vez que seu retorno de chamada é chamado. Mas é bastante fácil de usar. Um post sobre este tema foi escrito um par de anos atrás:

http://android-developers.blogspot.com/ 2007/11 / ponto-in-time.html

Outras dicas

O que eu acho que está acontecendo é que você está caindo fora do segmento. Há um único segmento "looper", que lida com todas as atualizações de tela. Se você tentar chamar "invalidate ()" e você não está sobre este tópico não vai acontecer nada.

Tente usar "postInvalidate ()" na sua visão em seu lugar. Ele vai deixar você atualizar uma visão quando você não está no segmento interface do usuário atual.

Mais informações aqui

Use o código abaixo para tempo definido em TextView

public class MyCountDownTimer extends CountDownTimer {
        public MyCountDownTimer(long startTime, long interval) {
            super(startTime, interval);
        }

        @Override
        public void onFinish() {

            ExamActivity.this.submitresult();
        }

        @Override
        public void onTick(long millisUntilFinished) {

            long millis = millisUntilFinished;

            int seconds = (int) (millis / 1000) % 60;
            int minutes = (int) ((millis / (1000 * 60)) % 60);
            int hours = (int) ((millis / (1000 * 60`enter code here` * 60)) % 24);

            String ms = String
                    .format("%02d:%02d:%02d", hours, minutes, seconds);
            txtimedisplay.setText(ms);
        }
    }

Há mais uma maneira do texto da mudança a cada segundo; este é ValueAnimator. Aqui está a minha solução:

  long startTime = System.currentTimeMillis();
  ValueAnimator animator = new ValueAnimator();
            animator.setObjectValues(0, 1000);
            animator.setDuration(1000);
            animator.setRepeatCount(ValueAnimator.INFINITE);
            animator.addListener(new AnimatorListenerAdapter() {

                @Override
                public void onAnimationStart(Animator animation) {
                    long currentTime = System.currentTimeMillis();
                    String text = TimeFormatUtils.formatTime(startTime - currentTime);
                   yourTextView.setText(text);
                }

                @Override
                public void onAnimationRepeat(Animator animation) {
                    long currentTime = System.currentTimeMillis();
                    String text = TimeFormatUtils.formatTime(startTime - currentTime);
                    yourTextView.setText(text);
                }
            });
            animator.start();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top