我现在感觉非常非常愚蠢……我觉得我一定很想念一些明显的东西。

我已经多次遇到此问题的变体,但是这是我当前的示例-

创建活动后,旁边将有一个标记为“开始”且文本设置为-:-的按钮。我想要这样,以便当按下按钮时,计时器从一分钟开始,并显示-:-文本中剩余的秒数,如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));
            }
        };
    }
}


(我拿出了一堆东西,并重新添加了一些非常早的代码,所以有点像是杂烩,但是想法在那里。)

08-04 07:26