我想知道是否有任何方法使用计时器类分配给 textView 以便从 10 倒数到 0 并实时显示它?
我已经调查过了,发现了 Chronometer 功能,但我知道它只会计数?
我想学习如何做到这一点,那么有什么方法可以做到吗?如果是这样,如何?我完全不解。。
我想知道是否有任何方法使用计时器类分配给 textView 以便从 10 倒数到 0 并实时显示它?
我已经调查过了,发现了 Chronometer 功能,但我知道它只会计数?
我想学习如何做到这一点,那么有什么方法可以做到吗?如果是这样,如何?我完全不解。。
如果需要倒计时,android.os 包中有一个叫 CountDownTimer 的谐音类。
在这里(http://developer.android.com/reference/android/os/CountDownTimer.html)你可以找到这个类的正确用法。这正是您所需要的。
此类从 API 级别 1 开始存在,因此您不会陷入兼容性问题。
示例(来自文档)
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
mTextField.setText("done!");
}
}.start();
试试CountDownAnimation
。它完全符合您的需要。该项目包括一个测试。
如果您CountDownTimer
每 1 秒使用一次滴答声,您将不会得到最后一个滴答声。因此,我建议您尝试CountDownAnimation
使用Handler
.
我同意 Guglielmo Moretti 的观点,但如果您仍然想自己使用 TextView 来完成,而不是使用经典的观察者设计模式来实现。
您可以像下面的代码一样拥有自定义文本视图,
package com.example.stackoverflow;
import java.util.Observable;
import java.util.Observer;
import android.content.Context;
import android.widget.TextView;
public class MyTextView extends TextView implements Observer{
public MyTextView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public void update(Observable observable, Object data) {
// TODO Auto-generated method stub
this.setText(""+((Integer)data).intValue());
}
}
另外,像这样用 observalble 实现模式,
package com.example.stackoverflow;
import java.util.Observable;
public class MyTextViewModel extends Observable {
private int counter;
public MyTextViewModel(int initnumber){
this.counter = initnumber;
}
public void decrementCounter(){
if(this.counter>0){
this.counter--;
setChanged();
notifyObservers(this.counter);
}
}
}
像这样的测试活动,
package com.example.stackoverflow;
import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView tv;
LinearLayout ll;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// tv = (TextView) findViewById(R.id.textView1);
ll = (LinearLayout)findViewById(R.id.ll1);
MyTextView mtv = new MyTextView(getApplicationContext());
MyTextViewModel mm = new MyTextViewModel(10);
mm.addObserver(mtv);
mtv.setText("Not yet init");
ll.addView(mtv);
mm.decrementCounter(); // call this function in a thread and as many times as you want
}
}