Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.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 得分变量赢得';t更新,并且必须是最终的?_Java_Android_Final_Countdowntimer - Fatal编程技术网

Java 得分变量赢得';t更新,并且必须是最终的?

Java 得分变量赢得';t更新,并且必须是最终的?,java,android,final,countdowntimer,Java,Android,Final,Countdowntimer,我遇到的问题是,在我的程序中,我的分数计数器变量“score”不能高于1。如果用户输入的值等于显示的随机数(LoadG1),他们将获得一分。然后在末尾输出,如较长的计时器所示。在较短的计时器中,添加点。int变量在开头声明。所有内容如下所示。现在我知道它是最终的,这很可能是我的问题的原因,但是IDE要求它是最终的,否则我只能在一个方法中调用变量“score”(在我的例子中是倒计时)。这给我带来了麻烦。如果用户每次都有正确的输入,我打算在4秒计时器重复时添加一个点,尽管此时不能超过1。我希望在最后

我遇到的问题是,在我的程序中,我的分数计数器变量“score”不能高于1。如果用户输入的值等于显示的随机数(LoadG1),他们将获得一分。然后在末尾输出,如较长的计时器所示。在较短的计时器中,添加点。int变量在开头声明。所有内容如下所示。现在我知道它是最终的,这很可能是我的问题的原因,但是IDE要求它是最终的,否则我只能在一个方法中调用变量“score”(在我的例子中是倒计时)。这给我带来了麻烦。如果用户每次都有正确的输入,我打算在4秒计时器重复时添加一个点,尽管此时不能超过1。我希望在最后输出最终分数,如下所示

守则:

final int[] score = {0};
final Random generateG1 = new Random();
final int loadG1 = generateG1.nextInt(1000000)+10000;
final TextView number = (TextView) findViewById(R.id.number);
number.setText(" "+loadG1);

final CountDownTimer loop = new CountDownTimer(4000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
    number.setVisibility(View.GONE);
    final TextView prompt = (TextView) findViewById(R.id.prompt);
    prompt.setVisibility(View.VISIBLE);
    prompt.setText(" Enter the number");
    final EditText input = (EditText) findViewById(R.id.enterAnswer);
    input.setVisibility(View.VISIBLE);
    input.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_ENTER:
                        Editable answer = input.getText();
                        int finalAnswer = Integer.parseInt(String.valueOf(answer));
                        int finalLoadG1 = Integer.parseInt(String.valueOf(loadG1));
                        input.setVisibility(View.GONE);
                        prompt.setVisibility(View.GONE);
                        if (finalAnswer == finalLoadG1) {
                            score[0]++;
                        }

                        number.setVisibility(View.VISIBLE);
                        final int loadG1 = generateG1.nextInt(1000000) + 10000;
                        number.setText(" " + loadG1);
                        input.getText().clear();

                        start();

                        return true;
                    default:
                }
            }
            return false;
        }
    });
}
}.start();

new CountDownTimer(24000, 1000) {
@Override
public void onTick (long millisUntilFinished) {
}
@Override
public void onFinish() {
    TextView result = (TextView) findViewById(R.id.outcome);
    result.setText("Score: "+ score[0]);
    TextView prompt = (TextView) findViewById(R.id.prompt);
    prompt.setVisibility(View.GONE);
    final EditText input = (EditText) findViewById(R.id.enterAnswer);
    input.setVisibility(View.GONE);
    loop.cancel();
}
}.start();

如果有人能为我的问题提供解决方案,我将不胜感激。提前谢谢。

因为您没有读取生成的随机值,只是第一个值。因此,第一次回答是正确的,但下次回答不同,但是
if
与第一次生成的随机数比较,因此它不算有效答案(如果您始终输入相同的第一个数字,它将计数)。由于存在当前号码,因此每次都需要从文本编辑号码中读取该号码

因此可能是:

final int[] score = {0};
final Random generateG1 = new Random();
final int loadG1 = generateG1.nextInt(1000000)+10000;
final TextView number = (TextView) findViewById(R.id.number);
number.setText(" "+loadG1);

final CountDownTimer loop = new CountDownTimer(4000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
    number.setVisibility(View.GONE);
    final TextView prompt = (TextView) findViewById(R.id.prompt);
    prompt.setVisibility(View.VISIBLE);
    prompt.setText(" Enter the number");
    final EditText input = (EditText) findViewById(R.id.enterAnswer);
    input.setVisibility(View.VISIBLE);
    input.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_ENTER:
                        Editable answer = input.getText();
                        int finalAnswer = Integer.parseInt(String.valueOf(answer));
                        // here we get from text field the current correct value
                        int finalLoadG1 = Integer.parseInt(String.valueOf(number.getText()));
                        input.setVisibility(View.GONE);
                        prompt.setVisibility(View.GONE);
                        if (finalAnswer == finalLoadG1) {
                            score[0]++;
                        }

                        number.setVisibility(View.VISIBLE);
                        final int loadG1 = generateG1.nextInt(1000000) + 10000;
                        number.setText(" " + loadG1);
                        input.getText().clear();

                        start();

                        return true;
                    default:
                }
            }
            return false;
        }
    });
}
}.start();

new CountDownTimer(24000, 1000) {
@Override
public void onTick (long millisUntilFinished) {
}
@Override
public void onFinish() {
    TextView result = (TextView) findViewById(R.id.outcome);
    result.setText("Score: "+ score[0]);
    TextView prompt = (TextView) findViewById(R.id.prompt);
    prompt.setVisibility(View.GONE);
    final EditText input = (EditText) findViewById(R.id.enterAnswer);
    input.setVisibility(View.GONE);
    loop.cancel();
}
}.start();
此外,您可以(也应该)使用AtomicInteger而不是
int[]
,您感兴趣的方法有:

int AtomicInteger#get();
int AtomicInteger#incrementAndGet()
因此,将分数声明为原子整数,如下所示:

final AtomicInteger score = new AtomicInteger();
然后,而不是
得分[0]+
do
score.incrementAndGet()


然后在阅读结果时执行:
score.get()

,因为您没有读取生成的随机值,而是第一个值。因此,第一次回答是正确的,但下次回答不同,但是
if
与第一次生成的随机数比较,因此它不算有效答案(如果您始终输入相同的第一个数字,它将计数)。由于存在当前号码,因此每次都需要从文本编辑号码中读取该号码

因此可能是:

final int[] score = {0};
final Random generateG1 = new Random();
final int loadG1 = generateG1.nextInt(1000000)+10000;
final TextView number = (TextView) findViewById(R.id.number);
number.setText(" "+loadG1);

final CountDownTimer loop = new CountDownTimer(4000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
    number.setVisibility(View.GONE);
    final TextView prompt = (TextView) findViewById(R.id.prompt);
    prompt.setVisibility(View.VISIBLE);
    prompt.setText(" Enter the number");
    final EditText input = (EditText) findViewById(R.id.enterAnswer);
    input.setVisibility(View.VISIBLE);
    input.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_ENTER:
                        Editable answer = input.getText();
                        int finalAnswer = Integer.parseInt(String.valueOf(answer));
                        // here we get from text field the current correct value
                        int finalLoadG1 = Integer.parseInt(String.valueOf(number.getText()));
                        input.setVisibility(View.GONE);
                        prompt.setVisibility(View.GONE);
                        if (finalAnswer == finalLoadG1) {
                            score[0]++;
                        }

                        number.setVisibility(View.VISIBLE);
                        final int loadG1 = generateG1.nextInt(1000000) + 10000;
                        number.setText(" " + loadG1);
                        input.getText().clear();

                        start();

                        return true;
                    default:
                }
            }
            return false;
        }
    });
}
}.start();

new CountDownTimer(24000, 1000) {
@Override
public void onTick (long millisUntilFinished) {
}
@Override
public void onFinish() {
    TextView result = (TextView) findViewById(R.id.outcome);
    result.setText("Score: "+ score[0]);
    TextView prompt = (TextView) findViewById(R.id.prompt);
    prompt.setVisibility(View.GONE);
    final EditText input = (EditText) findViewById(R.id.enterAnswer);
    input.setVisibility(View.GONE);
    loop.cancel();
}
}.start();
此外,您可以(也应该)使用AtomicInteger而不是
int[]
,您感兴趣的方法有:

int AtomicInteger#get();
int AtomicInteger#incrementAndGet()
因此,将分数声明为原子整数,如下所示:

final AtomicInteger score = new AtomicInteger();
然后,而不是
得分[0]+
do
score.incrementAndGet()


然后在阅读结果时执行:
score.get()

您是否编写了
final int[]score={0}onCreate
中的code>


尝试写入
int[]分数={0}
作为全局变量从创建时的
中删除。

您是否编写了
final int[]score={0}onCreate
中的code>


尝试写入
int[]分数={0}
作为全局变量从创建时的
中删除。

尝试提出一个最简单可行的示例。我不确定你的问题在哪里。有一个最终的数组是可以的,这只是意味着数组本身将保持不变,但是数组中的一个条目仍然可以更新。你不能让
score
成为你的类的一个成员变量吗?可能是重复的看看我的答案,它应该会帮助你,我已经发现了你的问题尝试提出一个最小可行的例子。我不确定你的问题在哪里。有一个最终数组是可以的-这只是意味着数组本身将保持不变,但数组中的一个条目仍然可以更新。你不能将
score
作为你的类的成员变量吗?可能重复看看我的答案,它应该会帮助你,我发现了你的问题我根据你的建议修改了它。它最初不起作用,所以我在“loadG1”之前去掉了“”空间,现在可以工作了。谢谢。我根据你的建议修改了它。它最初不起作用,所以我在“loadG1”之前去掉了“”空间,现在可以工作了。谢谢