8

我想知道是否有任何方法使用计时器类分配给 textView 以便从 10 倒数到 0 并实时显示它?

我已经调查过了,发现了 Chronometer 功能,但我知道它只会计数?

我想学习如何做到这一点,那么有什么方法可以做到吗?如果是这样,如何?我完全不解。。

4

3 回答 3

20

如果需要倒计时,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();
于 2012-09-26T19:12:44.517 回答
1

试试CountDownAnimation。它完全符合您的需要。该项目包括一个测试。

如果您CountDownTimer每 1 秒使用一次滴答声,您将不会得到最后一个滴答声。因此,我建议您尝试CountDownAnimation使用Handler.

于 2014-02-27T23:23:24.053 回答
0

我同意 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
}
}
于 2012-09-26T19:24:28.793 回答