“如何在启用Button的同时显示CountDown?”
有关按钮的其他信息:“按钮作业”是通过在Textview中显示的字符串数组单击5次,然后禁用5秒钟来再次执行相同的任务。
所以..我希望CountDown可以直观地显示这5秒钟(启用按钮的时间)倒数,以供用户查看。
不幸的是,我不知道如何将我的Button与CountDown连接起来,以使其知道在启用Button的特定时间应该倒数。
我也希望CountDown每次启用按钮时都启动。
我调查了https://developer.android.com/reference/android/os/CountDownTimer 但似乎没有针对该特定情况的解决方案。
那是我到目前为止的按钮代码:
next_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentnumber == list.length) {
currentnumber = 0;
}
if (Curclicks == mod - 1) {
next_button.setEnabled(false);
display.setText(list[currentnumber]);
currentnumber++;
handler.postDelayed(new Runnable() {
@Override
public void run() {
//the button will unlock after the delay specified
next_button.setEnabled(true);
Curclicks = 0;
}
}, delay);
} else {
display.setText(list[currentnumber]);
currentnumber++;
}
Curclicks++;
}
});
UI线程代码可以解决吗? :
private void runThread() {
new Thread() {
public void run() {
while (delay == 5000) { //delay = 5000 ( 5 secs)
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
timer.setText("" + delay);//timer=TxtView
}
});
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
答案 0 :(得分:0)
此函数应执行您想要的操作,只需将其调用OnClickListener
public void countDown(Button yourBtn) {
new Thread() {
public void run() {
try {
int second = 10;
for (int i = second; i >= 1; i--) {
int finalI = i;
yourBtn.post(new Runnable() {
@Override
public void run() {
yourBtn.setText(String.valueOf(finalI))
}
});
Thread.sleep(1000); // Change text every 1s
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
答案 1 :(得分:0)
这是一个示例,说明如何使用postDelayed()
的{{1}}方法创建倒计时。我故意使代码有些冗长,因此您可以逐步进行操作以查看发生了什么。
创建一些类变量和常量。
Handler
private static final long COUNT_DOWN_TICKS = 100l;
private static final long COUNT_DOWN_FINISH = 5000l;
private long countdownElapsed = 0l;
private Handler mCountDownHandler = new Handler();
设置为5000-> 5秒。但是可以更改为您需要的任何内容。同样,我将COUNT_DOWN_FINISH
设置为100-> 0.1秒,以防万一您想显示更精确的倒数。
在您的COUNT_DOWN_TICKS
方法中,只需调用OnClick()
即可开始计数。
startCountDown()
为了正确处理private void startCountDown() {
try {
countdownElapsed = 0l;
next_button.setEnabled(false);
displayCountDown();
mCountDownHandler.postDelayed(mCountDownRunnable, COUNT_DOWN_TICKS);
}
catch (Exception ex){
Log.e(TAG, ex.getMessage());
}
}
private Runnable mCountDownRunnable = new Runnable() {
@Override
public void run() {
countdownElapsed = countdownElapsed + COUNT_DOWN_TICKS;
if(countdownElapsed >= COUNT_DOWN_FINISH){
releaseCountDownHandler();
next_button.setEnabled(true);
}
else{
mCountDownHandler.postDelayed(mCountDownRunnable, COUNT_DOWN_TICKS);
}
long secFull = countdownElapsed % 1000;
if(secFull == 0){
runOnUiThread(new Runnable() {
@Override
public void run() {
displayCountDown();
}
});
}
}
};
private void releaseCountDownHandler() {
try {
if(mCountDownRunnable != null) {
mCountDownHandler.removeCallbacks(mCountDownRunnable);
}
}
catch (Exception ex){
Log.e(TAG, ex.getMessage());
}
}
private void displayCountDown(){
long t = (COUNT_DOWN_FINISH - countdownElapsed)/1000;
String myTime = String.valueOf(t);
timer.setText(myTime);
}
,您将需要通过Runnable
方法调用releaseCountDownHandler()
。这只是短暂运行的onPause()
,但仍然不应忽略它。
与Thread
方法相比,我更喜欢将Handler
与postDelay()
方法一起使用-有关使任何线程进入睡眠状态的事情令人感到困惑。另请注意,根据实现的不同,习惯用“> =” RATHER而不是“ ==”来检查经过的时间条件是个好主意(例如,您使用Thread.sleep()
),该条件可能会错过确切的时间值!
编辑
在您的SystemClock.elapsedRealtime()
类的定义下的某个地方(对于本示例,我将其称为Activity
),您将需要声明一些变量。由于它们是在类内部定义的,而不是在方法内部定义的,因此被称为“类变量”,并且在定义为“私有”时它们具有整个类的作用域。
MainActivity
您可能已经在public class MainActivity extends AppCompatActivity {
//class variables
private static final long COUNT_DOWN_TICKS = 100l;
private static final long COUNT_DOWN_FINISH = 5000l;
private long countdownElapsed = 0l;
private Handler mCountDownHandler = new Handler();
private Button next_button;
private TextView timer;
....
}
类的onClick()
方法内声明了onCreate()
方法。因此,只需添加以下代码:
MainActivity
我提供的所有其他内容都是next_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startCountDown();
}
类内部的方法,而没有其他任何方法。因此,在MainActivity
方法下面,添加我之前发布的所有方法。
它看起来像这样:
onCreate()
答案 2 :(得分:0)
除了上面的代码引入了“点击计数器”之外,该代码类似于我上面的代码。我引入了一个新的类变量来跟踪单击按钮的次数。我还引入了一个名为“ NUMBER_OF_BUTTON_CLICKS”的新常数,该常数用作点击的上限。
用户现在可以单击按钮5次(在这种情况下)。在第五次单击时,满足触发startCountDown
方法的条件,并且按钮已禁用5秒钟。
public class MainActivity extends AppCompatActivity {
//Constant values
private static final String TAG = MainActivity.class.getSimpleName();
private static final int NUMBER_OF_BUTTON_CLICKS = 5;
private static final long COUNT_DOWN_TICKS = 100l;
private static final long COUNT_DOWN_FINISH = 5000l;
//class variables
private int howManyClicks = 0;
private long countdownElapsed = 0l;
private Handler mCountDownHandler = new Handler();
private Button next_button;
private TextView timer;
private TextView clicks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// you must compensate for the actual layout for your activity
setContentView(R.layout.activity_main);
// you must compensate for the actual id of the TextView
timer = findViewById(R.id.tvTimer);
// Use this only if you want to display the number of clicks
// you might need to add this TextView if you want to display the number of clicks
clicks = findViewById(R.id.tvClicks);
// you must compensate for the actual id of the Button
next_button = findViewById(R.id.btnNext);
next_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
howManyClicks++;
if(howManyClicks >= NUMBER_OF_BUTTON_CLICKS){
startCountDown();
}
//Add this only if you want to see how many clicks were made
String myClicks = String.valueOf(howManyClicks);
clicks.setText(myClicks)
}
});
}
private void startCountDown() {
try {
countdownElapsed = 0l;
next_button.setEnabled(false);
displayCountDown();
mCountDownHandler.postDelayed(mCountDownRunnable, COUNT_DOWN_TICKS);
}
catch (Exception ex){
Log.e(TAG, ex.getMessage());
}
}
private Runnable mCountDownRunnable = new Runnable() {
@Override
public void run() {
countdownElapsed = countdownElapsed + COUNT_DOWN_TICKS;
if(countdownElapsed >= COUNT_DOWN_FINISH){
releaseCountDownHandler();
next_button.setEnabled(true);
// reset the clicks counter
howManyClicks = 0;
}
else{
mCountDownHandler.postDelayed(mCountDownRunnable, COUNT_DOWN_TICKS);
}
long secFull = countdownElapsed % 1000;
if(secFull == 0){
runOnUiThread(new Runnable() {
@Override
public void run() {
displayCountDown();
}
});
}
}
};
private void releaseCountDownHandler() {
try {
if(mCountDownRunnable != null) {
mCountDownHandler.removeCallbacks(mCountDownRunnable);
}
}
catch (Exception ex){
Log.e(TAG, ex.getMessage());
}
}
private void displayCountDown(){
long t = (COUNT_DOWN_FINISH - countdownElapsed)/1000;
String myTime = String.valueOf(t);
timer.setText(myTime);
//Add this only if you want to see how many clicks were made
String myClicks = String.valueOf(howManyClicks);
clicks.setText(myClicks)
}
}