Java Can';无法理解禁用按钮的行为
我是android新手,对Java中的计时概念也很陌生。我尝试创建一个简单的应用程序,它可以计算用户在五秒钟内点击屏幕的次数。时间结束后,我想禁用该按钮,并在单击“重新启动”按钮时重新启动所有内容 这是当前代码:Java Can';无法理解禁用按钮的行为,java,android,countdowntimer,Java,Android,Countdowntimer,我是android新手,对Java中的计时概念也很陌生。我尝试创建一个简单的应用程序,它可以计算用户在五秒钟内点击屏幕的次数。时间结束后,我想禁用该按钮,并在单击“重新启动”按钮时重新启动所有内容 这是当前代码: public void clickCounter(View view){ ++counter; if(showCounter!=null) showCounter.setText(Integer.toString(counter)); } public
public void clickCounter(View view){
++counter;
if(showCounter!=null)
showCounter.setText(Integer.toString(counter));
}
public void clickTimer(final View view) {
final Button Tap = findViewById(R.id.Tap);
clickCounter(view);
new CountDownTimer(5000, 5000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
Tap.setEnabled(false);
}
}.start();
}
public void restartCounter(View view) {
counter=0;
showCounter.setText("Tap");
final Button Tap = findViewById(R.id.Tap);
Tap.setEnabled(true);
}
按钮在5秒钟后确实会禁用,但“重新启动”按钮有时会启用,然后立即禁用(计数器和文本会正确更改)
我认为问题可能在于我使用计时器的方式(也许我应该使用线程?您在每次点击按钮时都会创建一个新的计时器。因此,当您重新启用该按钮时,您的一个计时器可能会过期,随后禁用该按钮。只有在没有计时器运行的情况下,才应创建新计时器。您在每次点击按钮时都会创建一个新计时器。因此,当您重新启用该按钮时,您的一个计时器可能会过期,随后禁用该按钮。只有在没有计时器运行的情况下,才应该创建新计时器。要扩展上的精彩答案,问题是每次调用
clickTimer()
方法时,都要创建一个新的CountDownTimer对象
按钮在5秒钟后确实会禁用,但“重新启动”按钮有时会启用,然后立即禁用(计数器和文本会正确更改)
这是为了扩展这个令人敬畏的答案,问题是每次调用clickTimer()
方法时,您都在创建一个新的CountDownTimer对象
按钮在5秒钟后确实会禁用,但“重新启动”按钮有时会启用,然后立即禁用(计数器和文本会正确更改)
这我明白你的意思,但当我尝试它的应用程序崩溃。我是这样实现的:
public void clickCounter(View-View){if(counter==0)cdt.start();+counter;if(showCounter!=null)showCounter.setText(Integer.toString(counter));}public CountDownTimer cdt=new CountDownTimer(50005000){final Button Tap=findViewById(R.id.Tap);public void onTick(long millisuntiltfinished){}public void onFinish(){Tap.setEnabled(false);}}代码>您放置了行final按钮Tap=findviewbyd(R.id.Tap)代码>在错误的位置。将其置于倒计时程序块之外。NullPointerException。cdt.start()
在创建cdt之前执行。更好的是,您可以将其作为全局变量:public CountDownTimer cdt
然后在onCreate()中使用它:cdt=newcountdowntimer(50005000){…}
只有当我放置final按钮Tap=findviewbyd(R.id.Tap)时,它才会工作在onCreate()中的cdt=new CountDownTimer(50005000){…}
中的code>。因此,为了确保我理解,cdt是在创建时创建的,从现在起,我可以随时使用cdt.start()调用它-每次都不创建新计时器?我理解你的意思,但当我尝试时,应用程序崩溃了。我是这样实现的:public void clickCounter(View-View){if(counter==0)cdt.start();+counter;if(showCounter!=null)showCounter.setText(Integer.toString(counter));}public CountDownTimer cdt=new CountDownTimer(50005000){final Button Tap=findViewById(R.id.Tap);public void onTick(long millisuntiltfinished){}public void onFinish(){Tap.setEnabled(false);}}代码>您放置了行final按钮Tap=findviewbyd(R.id.Tap)代码>在错误的位置。将其置于倒计时程序块之外。NullPointerException。cdt.start()
在创建cdt之前执行。更好的是,您可以将其作为全局变量:public CountDownTimer cdt
然后在onCreate()中使用它:cdt=newcountdowntimer(50005000){…}
只有当我放置final按钮Tap=findviewbyd(R.id.Tap)时,它才会工作在onCreate()中的cdt=new CountDownTimer(50005000){…}
中的code>。所以为了确保我理解,cdt是在create上创建的,从现在起,我可以随时使用cdt.start()调用它,而不必每次都创建新的计时器?