Android TextView Temporizador
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);
}
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();