我对如何在Android中正确使用变量感到困惑

时间:2012-01-05 17:55:22

标签: java android

我现在感觉非常非常愚蠢...我觉得我必须遗漏一些非常明显的东西。

我现在多次遇到过这个问题的变化,但这是我当前的例子 -

创建活动后,会有一个标记为“开始”的按钮,文本设置为 - : - 旁边的。我想拥有它,以便按下按钮时,计时器从一分钟开始,并显示 - : - 文本中剩余的秒数为00:59等等,按钮上的文字变为暂停。如果在计时器运行时按下该按钮,它会暂停计时器并将按钮上的文本更改为“开始”。

所以我使用boolean,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; 
            }
        });


    }
}

3 个答案:

答案 0 :(得分:2)

如果没有源背景,很难想象你正在做什么。

您如何定义点击处理程序?如果它是一个匿名类,你会遇到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));
            }
        };
    }
}

(我把一堆东西拿出来,并添加了一些非常早期的代码,所以这有点像mish-mosh,但是这些想法都存在。)

答案 1 :(得分:2)

您的new OnClickListener(){..}实际上是一个匿名类:http://mindprod.com/jgloss/anonymousclasses.html

匿名类可以访问封闭类的类(静态)和实例字段。因此,解决方案是将timerRunning定义为字段,即在onCreate()方法之外定义它。

答案 2 :(得分:1)

它没有在任何地方启动代码,你只是将它设置为true,它是一个计时器。观看这里的教程,他们应该真的帮助你。 cornboyzandroid 他早期的一些视频真实地描述了如何非常清楚地逐步完成计时器。他帮助处理全局和局部变量。在第6集或第7集中,只是检查他的页面。