我想实现一个按下时倒计时的按钮。想法是允许用户取消激活按钮。一旦按下,我希望按钮变为红色并读取“CANCEL(3)”并倒计时到“CANCEL(0)”,如果再次按下,倒计时将停止,不会发生任何事情。如果未取消,应用程序将在时间到期后转到下一个屏幕。有没有办法每秒更新按钮的文本(倒计时)并更改其功能?
由于
答案 0 :(得分:4)
您可以在处理程序上使用postDelayed
稍后在UI线程上调用您的方法,以便您可以更新UI。
实际上有一篇关于如何在Android上完成此操作的非常好的文章:http://developer.android.com/resources/articles/timed-ui-updates.html
您可以通过在UI线程上运行的代码中创建一个处理程序,或者通过在视图上调用getHandler()
(例如您的按钮本身)来获取处理程序。
我提供了一个例子,但链接的文章已经非常详细和清晰,所以我会遵从它。
编辑:这里概述了它的外观。我目前没有安装Android SDK,因此我无法验证这是否有效。
public class CountdownButton extends Button {
private boolean isCounting = false;
private int count;
private final Runnable countdownRunnable = new Runnable() {
@Override
public void run() {
setText(Integer.toString(count));
if (count > 0) {
count--;
getHandler().postDelayed(countdownRunnable, 1000);
} else {
// count reached zero
isCounting = false;
setText("boom");
}
}
}
private final View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isCounting) {
// stop counting
isCounting = false;
getHandler().removeCallbacks(countdownRunnable);
setText("cancelled");
} else {
// start counting
isCounting = true;
count = 10;
countdownRunnable.run();
}
}
}
public CountdownButton(Context context) {
super(context);
setOnClickListener(onClickListener);
}
public CountdownButton(Context context, AttributeSet attrs) {
super(context, attrs);
setOnClickListener(onClickListener);
}
public CountdownButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setOnClickListener(onClickListener);
}
}
时机可能并不完美(特别是如果还有很多其他CPU工作正在进行中),但它应该足以满足您的需要。