Java Android是指内部类中的非最终答案

时间:2012-01-06 18:40:20

标签: java android

是的,我已经看过其他问题并且我已经阅读了这些问题并且我已经尝试了解它但我认为我正在努力使其在我的方案中起作用。

Random rand = new Random();
int randNumber;
long chosenNumber;
String answer;
while (questionCount < 3) {
//---get all titles---
db.open();
Cursor c = db.getAllTitles();
if (c.moveToFirst())
{
    do {          
        DisplayTitle(c);
    } while (c.moveToNext());
}
db.close();

//---pick a question---
db.open();
randNumber = rand.nextInt(3);
chosenNumber = (long) randNumber;

String questionPrompt = db.pickQuestion(chosenNumber);
while (questionPrompt == null)
{
    randNumber = rand.nextInt(3);
    chosenNumber = (long) randNumber;
    questionPrompt = db.pickQuestion(chosenNumber);
}

answer = db.pickQuestion(chosenNumber);
question.setText(questionPrompt);
db.close();

btnclickme.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        String str = txtname.getText().toString();
            if (str.equalsIgnoreCase(answer)) {
                Toast.makeText(getBaseContext(), "That is correct!", Toast.LENGTH_SHORT).show();
        }

            else
                Toast.makeText(getBaseContext(), "That is incorrect, try again.", Toast.LENGTH_SHORT).show();
        }
    }); 

我得到错误无法引用非最终变量答案...无论何时我试图检查来自用户的文本是否等于字符串答案。我的问题是,我如何做到这一点,所以我可以编辑答案(我将不断调用不同的问题,就像把它放在一个while循环中,一遍又一遍地改变答案)所以每次我把答案作为最后的答案,它不会改变下一个问题。我是否必须为每个问题创建一个变量?帮助!

4 个答案:

答案 0 :(得分:1)

最简单的做法是final。如果这听起来违反直觉,请注意最终意味着指针的地址不能改变......但是,存储在那里的值可以。因此,您可以使用可变数据结构,例如java.lang.StringBuilder,并在仍为final时对其进行修改,并在需要时调用.toString()

答案 1 :(得分:0)

将其设为如下所示的实例变量:

public class Test
{
     // Instance Variable
     private int x;

     public void OnCreate ...

答案 2 :(得分:0)

如果您需要更改该值,请将其设为成员变量,而不是方法本地:

public class SomeClass {

    private String answer;

答案 3 :(得分:0)

如果将循环体移动到另一个方法中,则可以在此处使用最终局部变量。每次调用方法时,最终变量都可以有不同的值。

但是,如果您为点击侦听器使用了命名类,则可能会更清楚:

class AnswerListener extends View.OnClickListener {
   String answer;
   EditText txtname;

   AnswerListener(String answer, EditText txtname) {
      this.answer = answer;
      this.txtname = txtname;
   }

   public void onClick(View v) { ... }
}

然后你可以btnclickme.setOnClickListener(new AnswerListener(answer, txtname)),明确传递值,而不是依赖于从最终变量中提取它们。