Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java I';对于如何在Android中正确使用变量,我有点困惑_Java_Android - Fatal编程技术网

Java I';对于如何在Android中正确使用变量,我有点困惑

Java I';对于如何在Android中正确使用变量,我有点困惑,java,android,Java,Android,我现在感觉非常非常愚蠢。。。我觉得我一定错过了一些非常明显的东西 我已经在很多场合遇到过这个问题的各种变体,但这里是我当前的示例- 创建活动时,将有一个标记为“开始”的按钮,其旁边的文本设置为--:--。我希望这样,当按下按钮时,计时器从一分钟开始计时,并将--:--文本中剩余的秒数显示为00:59等,按钮上的文本变为暂停。如果在计时器运行时按下该按钮,则会暂停计时器并将按钮上的文本更改为“开始” 所以我使用了一个布尔值,timerRunning,来跟踪计时器是否在运行。但是如果我试图在onCl

我现在感觉非常非常愚蠢。。。我觉得我一定错过了一些非常明显的东西

我已经在很多场合遇到过这个问题的各种变体,但这里是我当前的示例-

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

所以我使用了一个布尔值,timerRunning,来跟踪计时器是否在运行。但是如果我试图在onClickListener中更改timerRunning,它会给出一个错误,并告诉我将timerRunning更改为final,然后一旦我这样做,它会说“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; 
            }
        });


    }
}

没有源上下文,很难想象你在做什么

如何定义单击处理程序?如果它是一个匿名类,那么您将遇到
最终的
问题——您的活动或处理程序是否如此复杂以至于完全需要一个单独的类

在前面的问题中,我的单击处理程序是由活动实现的,因此它可以访问该实例的变量。我在没有使用
倒计时之前所做的事情的一个非常简短的框架:

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