Java I';对于如何在Android中正确使用变量,我有点困惑
我现在感觉非常非常愚蠢。。。我觉得我一定错过了一些非常明显的东西 我已经在很多场合遇到过这个问题的各种变体,但这里是我当前的示例- 创建活动时,将有一个标记为“开始”的按钮,其旁边的文本设置为--:--。我希望这样,当按下按钮时,计时器从一分钟开始计时,并将--:--文本中剩余的秒数显示为00:59等,按钮上的文本变为暂停。如果在计时器运行时按下该按钮,则会暂停计时器并将按钮上的文本更改为“开始” 所以我使用了一个布尔值,timerRunning,来跟踪计时器是否在运行。但是如果我试图在onClickListener中更改timerRunning,它会给出一个错误,并告诉我将timerRunning更改为final,然后一旦我这样做,它会说“final局部变量timerRunning无法赋值,因为它是在封闭类型中定义的。” 如果这还不清楚的话,我很抱歉-我真的很困惑我应该在哪里声明变量/如何访问它们等等。在Android中,我真的不明白为什么我总是遇到奇怪的错误 谢谢Java I';对于如何在Android中正确使用变量,我有点困惑,java,android,Java,Android,我现在感觉非常非常愚蠢。。。我觉得我一定错过了一些非常明显的东西 我已经在很多场合遇到过这个问题的各种变体,但这里是我当前的示例- 创建活动时,将有一个标记为“开始”的按钮,其旁边的文本设置为--:--。我希望这样,当按下按钮时,计时器从一分钟开始计时,并将--:--文本中剩余的秒数显示为00:59等,按钮上的文本变为暂停。如果在计时器运行时按下该按钮,则会暂停计时器并将按钮上的文本更改为“开始” 所以我使用了一个布尔值,timerRunning,来跟踪计时器是否在运行。但是如果我试图在onCl
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;
}
});
}
}
没有源上下文,很难想象你在做什么 如何定义单击处理程序?如果它是一个匿名类,那么您将遇到
最终的问题——您的活动或处理程序是否如此复杂以至于完全需要一个单独的类
在前面的问题中,我的单击处理程序是由活动实现的,因此它可以访问该实例的变量。我在没有使用倒计时之前所做的事情的一个非常简短的框架:
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));
}
};
}
}
(我去掉了很多东西,并添加了一些非常早期的代码,所以这有点小麻烦,但想法是有的。)没有源代码上下文,很难想象你在做什么
如何定义单击处理程序?如果它是一个匿名类,那么您将遇到最终的问题——您的活动或处理程序是否如此复杂以至于完全需要一个单独的类
在前面的问题中,我的单击处理程序是由活动实现的,因此它可以访问该实例的变量。我在没有使用倒计时之前所做的事情的一个非常简短的框架:
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));
}
};
}
}
(我拿出了一大堆东西,并添加了一些非常早期的代码,所以这有点小麻烦,但想法是有的。)您的新OnClickListener(){..}
实际上是一个匿名类:
匿名类可以访问封闭类的类(静态)和实例字段。因此,解决方案是将timerRunning
定义为一个字段,即在onCreate()
方法之外定义它 您的新OnClickListener(){..}
实际上是一个匿名类:
匿名类可以访问封闭类的类(静态)和实例字段。因此,解决方案是将timerRunning
定义为一个字段,即在onCreate()
方法之外定义它 它不会在任何地方启动代码,您只需将其设置为true,即它是一个计时器。看看这里的教程,它们应该会真正帮助你。
他早期的一些视频非常清晰地描述了如何一步一步地完成计时器。他帮助处理全局和局部变量。在第六集或第七集前后,只需查看他的页面。它不会在任何地方启动代码,您只需将其设置为true,即它是一个计时器。看看这里的教程,它们应该会真正帮助你。
他早期的一些视频非常清晰地描述了如何一步一步地完成计时器。他帮助处理全局和局部变量。在第6集或第7集前后,请查看他的页面。如果您发布一些代码而不是描述代码,会更加清晰。查看您的问题的简单代码版本会有所帮助。听起来你的活动应该不会很大。。。请发布。这不是安卓的问题。这是一个Java语言问题,特别是关于匿名子类的问题。显示一个,我们可以帮助。好的,会做的-对不起-我试图一般/描述性,因为我在类似的代码中不断得到类似的错误,但是的,代码会有所帮助。我道歉。(一分钟后我会编辑它)(代码并没有完成我描述的希望它完成的所有事情,因为我在变量问题上遇到了足够多的麻烦,希望在我继续之前解决这个问题)如果你发布一些代码而不是描述代码,这会更加清晰。看到你问题的简单代码版本会有所帮助。听起来你的活动应该不会很大。。。请发布。这不是安卓的问题。这是一个Java语言问题,特别是关于匿名子类的问题。显示一个,我们可以帮助。好的,会做的-对不起-我试图一般/描述性,因为我在类似的代码中不断得到类似的错误,但是的,代码会有所帮助。我道歉。(一分钟后我将编辑它)(代码并没有完成我描述的希望它完成的一切,因为我在变量问题上遇到了足够的麻烦,希望在我继续之前将其修复)非常感谢您的支持help@ShimmerGeek当然正如Peter所说,您可能不想/不需要将timerRunning
定义在onCreate
本身中,而是作为一个实例属性(如上面的代码中所述)。再次感谢您的出色回答-它实际上帮助我减少了在Android中声明/访问变量的困惑(现在我做对了,我不明白我怎么可能做错了!呸!)谢谢:@ShimmerGeek事后看来一切都很明显;)非常感谢您的支持help@ShimmerGeek当然正如Peter所说,您可能不希望/不需要在中定义timerRunning