【问题标题】:For Loop not waiting for user inputFor循环不等待用户输入
【发布时间】:2020-05-18 10:06:08
【问题描述】:

您好,我目前有一个 android 项目正在进行中。用户必须回答一个数学问题,然后应该奖励/拿走答案,然后代码应该显示第二个不同的问题,直到完成 10 个问题。问题是代码跳过循环并立即完成游戏​​。我曾尝试使用 while 循环,但发生了同样的问题。我考虑了一个 if 但无法弄清楚如何重新运行 if。以下是项目的全部代码,但主要问题是 for 循环。

package com.example.mixmathsv3;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Random;

public class SimpleModeActivity extends AppCompatActivity {

Button checkButt, nextQuestionButt;
TextView resultText, simpleQuestionText, scoreText, questionNumberText;
EditText userAnswer;

public volatile int completedTimes = 0;
public int scoreValue = 0;
public int intUserAnswer = 0;
public String questionAnswer = "";

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_simple_mode);


    resultText = (TextView) findViewById(R.id.result);
    checkButt = (Button) findViewById(R.id.checkButt);
    simpleQuestionText = (TextView) findViewById(R.id.simpleQuestionText);
    scoreText = (TextView) findViewById(R.id.scoreText);
    userAnswer = (EditText) findViewById(R.id.userAnswer);
    //nextQuestionButt = (Button) findViewById(R.id.nextQuestion/Butt);
    //questionNumberText = (TextView) findViewById(R.id.questionNumberText);





    final String[] questionArray = {"5+2", "10+3", "7+1", "9+0", "1+6"};
    final String[] answerArray = {"7", "13", "8", "9", "7"};
    final Random r = new Random();
    int arrayRandom = r.nextInt(questionArray.length);

    simpleQuestionText.setText(questionArray[arrayRandom]);
    questionAnswer = (answerArray[arrayRandom]);



    for (int i = 1; i < 11; i++) {
        //System.out.println(i);
        //Toast.makeText(getApplicationContext(), ("loop successful"), Toast.LENGTH_SHORT).show();



        checkButt.setEnabled(true);


        checkButt.setOnClickListener(new View.OnClickListener() {

            @SuppressLint("SetTextI18n")
            public void onClick(View v) {
                checkButt.setEnabled(false);

                intUserAnswer = Integer.parseInt(userAnswer.getText().toString());
                int intQuestionAnswer = Integer.parseInt(questionAnswer);


                if (intUserAnswer == intQuestionAnswer) {
                    resultText.setText("Correct");
                    scoreValue = scoreValue + 10;
                    //completedTimes = + 1;
                    //questionNumberText.setText(completedTimes);
                    Toast.makeText(getApplicationContext(), ("Your Score is " + scoreValue), Toast.LENGTH_SHORT).show();

                }

                if (intUserAnswer != intQuestionAnswer) {
                    resultText.setText("Incorrect");
                    scoreValue = scoreValue - 5;
                    //completedTimes = + 1;
                    //questionNumberText.setText(completedTimes)
                    Toast.makeText(getApplicationContext(), ("Your Score is " + scoreValue), Toast.LENGTH_SHORT).show();


                }
            }


        });

    }


    Toast.makeText(getApplicationContext(), ("Game Over"), Toast.LENGTH_SHORT).show();

【问题讨论】:

  • 你得到的答案指出了你的真正问题:缺乏对Android框架如何工作的理解。说真的:考虑尝试与 Android 一起学习基本的 java。首先学习足够的 Java 来理解您写下的代码基本的作用。然后获得针对 Android 特定问题的优秀教程,并使用这些教程。你就像一个想学习杂耍的人......同时还要学习骑独轮车。不要那样做。否则你会从一个令人沮丧的时刻走到下一个。
  • 问题在于这是大学时的作业。他给我们设置了它,没有教我们java或适当的android,所以这一切都必须在过去几个月内学会。是的,在没有老师(电晕)的情况下从 python 到 java 非常困难,这令人沮丧
  • 很抱歉听到这个消息,但是你真的应该和你的同龄人和你的导师谈谈。但除此之外:我仍然建议您从学习 android 教程开始。也许像youtube.com/watch?v=AkUfACbi6BE

标签: java android loops


【解决方案1】:

setOnClickListener 不会按照您的想法做:
setOnClickListener 用于注册一个方法,该方法在用户单击按钮时才被调用。
在您的示例中,for 循环注册了 10 次新的 onClickListener,这不是我们想要的。

在您的情况下,您不能使用立即执行的 for 循环。当用户单击按钮时更改问题和文本。

final String[] questionArray = {"5+2", "10+3", "7+1", "9+0", "1+6"};
final String[] answerArray = {"7", "13", "8", "9", "7"};
final Random r = new Random();
int answered = 0;
// Initial question
int arrayRandom = r.nextInt(questionArray.length);
simpleQuestionText.setText(questionArray[arrayRandom]);
questionAnswer = (answerArray[arrayRandom]);

checkButt.setEnabled(true);
checkButt.setOnClickListener(new View.OnClickListener() {

    @SuppressLint("SetTextI18n")
    public void onClick(View v) {
        checkButt.setEnabled(false);

        intUserAnswer = Integer.parseInt(userAnswer.getText().toString());
        int intQuestionAnswer = Integer.parseInt(questionAnswer);

        if (intUserAnswer == intQuestionAnswer) {
            resultText.setText("Correct");
            scoreValue = scoreValue + 10;
            //completedTimes = + 1;
            //questionNumberText.setText(completedTimes);
            Toast.makeText(getApplicationContext(), ("Your Score is " + scoreValue), Toast.LENGTH_SHORT).show();

        }

        if (intUserAnswer != intQuestionAnswer) {
            resultText.setText("Incorrect");
            scoreValue = scoreValue - 5;
            //completedTimes = + 1;
            //questionNumberText.setText(completedTimes)
            Toast.makeText(getApplicationContext(), ("Your Score is " + scoreValue), Toast.LENGTH_SHORT).show();

        }
        answered++;// We update the count of answered question
        if(answered == 10) {
            // Finish
            Toast.makeText(getApplicationContext(), ("Game Over"), Toast.LENGTH_SHORT).show();
        } else {
            // Change question
            int arrayRandom = r.nextInt(questionArray.length);
            simpleQuestionText.setText(questionArray[arrayRandom]);
            questionAnswer = (answerArray[arrayRandom]);
        }
    }

});

我建议您详细了解 Android 的工作原理和callback 方法。

【讨论】:

  • 谢谢,这在逻辑上更正确,我现在可以理解你的意思了。尽管这无法在我的代码中实现,但我认为这可能是我代码中方法的一个更基本的问题。我会把这个标记为正确的。
【解决方案2】:

您不需要将所有内容都放在循环中。将所有逻辑移到循环之外,它应该可以工作。

【讨论】:

  • 它现在可以工作了,代码只是没有做 OP 认为它应该做的事情
猜你喜欢
  • 2021-12-08
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多