我现在感觉非常非常愚蠢……我觉得我一定很想念一些明显的东西。
我已经多次遇到此问题的变体,但是这是我当前的示例-
创建活动后,旁边将有一个标记为“开始”且文本设置为-:-的按钮。我想要这样,以便当按下按钮时,计时器从一分钟开始,并显示-:-文本中剩余的秒数,如00:59等,然后按钮上的文本更改为暂停。如果在计时器运行时按下按钮,它将暂停计时器并将按钮上的文本更改为“开始”。
因此,我使用一个布尔值timerRunning来跟踪计时器是否正在运行。但是,如果我尝试在onClickListener中更改timerRunning,则会出现错误,并告诉我将timerRunning更改为final,然后执行此操作后,系统会显示“无法分配最终的局部变量timerRunning,因为它是用封闭类型定义的。 ”
如果还不清楚,我很抱歉-我真的很困惑应该在哪里声明变量/如何访问它们,等等。在Android中,我真的不明白为什么我总是一直收到奇怪的错误。
谢谢。
public class Timing extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.timing);
Button bStartJammer = (Button) findViewById(R.id.buttonStartJammer);
CountDownTimer cdtJammerTimer;
long lJammerTotalMS = 60000;
final boolean timerRunning = false;
bStartJammer.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
timerRunning = true;
}
});
}
}
最佳答案
没有源上下文,很难可视化您在做什么。
您如何定义点击处理程序?如果是匿名类,则会遇到final
问题-您的活动或处理程序是否如此复杂,以至于完全需要单独的类?
在上一个问题中,我的点击处理程序是由活动实现的,因此它可以访问该实例的变量。在不使用CountDownTimer
之前我一直在做的事情的简短缩写:
public class FooTimer extends Activity implements View.OnClickListener {
private CountDownTimer timer;
private TextView timerDisplay;
private Button pauseButton;
private boolean timerRunning = false;
private boolean timerDone = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
pauseButton = (Button) findViewById(R.id.pause_button);
pauseButton.setOnClickListener(this);
timerDisplay = (TextView) findViewById(R.id.timer_display);
timerDisplay.setText(String.format("%d:%02d:%02d", hours, minutes, seconds));
timer = newTimer();
timerRunning = true;
timer.start();
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.pause_button:
toggleTimer();
break;
}
}
private void toggleTimer() {
if (timerRunning) {
timer.cancel();
pauseButton.setText(getResources().getString(R.string.resume_label));
timerRunning = false;
} else if (timerDone) {
finishActivity(0);
} else {
seconds += 1;
timer = newTimer();
timer.start();
pauseButton.setText(getResources().getString(R.string.pause_label));
timerRunning = true;
}
}
private CountDownTimer newTimer() {
millis = (minutes * 60 * 1000) + ((seconds + 1) * 1000);
return new CountDownTimer(millis, 1000) {
public void onTick(long millisUntilFinished) {
timerDisplay.setText(String.format("%d:%02d:%02d", hours, minutes, seconds));
}
public void onFinish() {
timerDisplay.setText("Finished");
timerRunning = false;
timerDone = true;
pauseButton.setText(getResources().getString(R.string.back_label));
}
};
}
}
(我拿出了一堆东西,并重新添加了一些非常早的代码,所以有点像是杂烩,但是想法在那里。)