我想实现一个按下时倒计时的按钮。这个想法是允许用户取消按钮的激活。一旦按下,我希望按钮变为红色并显示“取消(3)”并倒计时为“取消(0)”,如果再次按下,倒计时将停止并且不会发生任何事情。如果不取消,则时间到后应用程序将进入下一个屏幕。有没有办法每秒更新按钮的文本(用于倒计时)并更改其功能?
谢谢
最佳答案
您可以在处理程序上使用 postDelayed
稍后在 UI 线程上调用您的方法,以便您可以更新 UI。
实际上已经有一篇非常好的文章介绍了如何在 Android 上完成此操作:http://developer.android.com/resources/articles/timed-ui-updates.html
您可以通过在 UI 线程上运行的代码中创建一个处理程序,或者通过在 View (例如按钮本身)上调用 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 工作正在进行时),但对于您的目的来说应该足够了。
关于java - 按钮倒计时 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245936/