2012-01-06 5 views
1

はい、私は他の質問を見て、私はそれらを読んだと私はそれを理解しようとしましたが、私はそれが私のシナリオで動作するように苦労していると思う。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(); 
     } 
    }); 

私は、私は、ユーザーからのテキストが文字列の答えに等しいかどうかを確認しようとしていたときにエラーが何であれ...非final変数answerを参照することはできません取得します。私の質問は、どのように私は答えを編集することができるように私はそれを作る(私はループの中にこれを入れ、何度も答えを変えるというように異なる質問を呼ぶつもりだから)それは次の質問のために変わらない。すべての質問に対して変数を作成する必要がありますか?助けて!

+0

私はあなたがメソッドローカルの代わりにメンバ変数にしたいと思います。 –

+0

私はそれを最終的にすることはできません、私は答えの変数を変更する計画があります。これは私のアプリケーションでは1つの質問のためだけですが、私はこれを(正確にはまだわかりません)周りにいくつかのループを入れて、データベースから質問を継続的に呼び出し、questionPromptとanswer変数を次の質問に変更します。 – LiverpoolFTW

答えて

1

最も簡単なのはfinalです。これが直感的ではないと思われる場合は、最終的にポインタのアドレスが変更できないことに注意してください。ただし、そこに格納されている値は変更できません。したがって、java.lang.StringBuilderのような可変データ構造を使用し、依然としてfinalの間に変更し、その値が必要なときに.toString()を呼び出すことができます。

+0

これはそれです!どうもありがとうございます。私は解決策のためにオンラインの時間を探していました。 stringbuilderクラスについて聞いたことがありません。数日前にJavaを使いこなすようになりました。私は主に私のコースでC++を使用しています。再度、感謝します。 – LiverpoolFTW

+0

問題ありません。 StringBufferもありますが、どちらもトリックです。ああ、どれくらい古いC++が足りないのか! –

+1

しかし、一度に複数の答えを聞いている場合、これは失敗します。すべてのリスナーは、リスナーが作成されたときの値ではなく、StringBuilderに最後に設定された値を期待しています。 –

0

それ以下のようなインスタンス変数行います

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

    public void OnCreate ... 
+0

これは文字列では機能しません。少なくとも私が試してみると違法な修飾子のエラーが出る – LiverpoolFTW

0

あなたが値を変更する必要がある場合は、それメンバ変数の代わりの方法は、ローカル作る:あなたが使用することができます

public class SomeClass { 

    private String answer; 
+0

これは文字列では機能しません。少なくとも私が試してみると、違法な修飾子のエラーが出るだけです。 – LiverpoolFTW

+0

メソッド内でアクセス修飾子を使用することはできません。クラス内で宣言しますが、メソッドや他の種類のブロックの外側に宣言してください。 –

0

ループ本体を別のメソッドに移動した場合の最終的なローカル変数です。メソッドが呼び出されるたびに、最終変数が異なる値を持つことは問題ありません。

あなたがクリックリスナーの名前のクラスを使用する場合には、しかし、明確に次のようになります。そして、あなたが最終からピックアップされ、それらに頼るのではなく、明示的に値を渡し、btnclickme.setOnClickListener(new AnswerListener(answer, txtname))を行うだけでできる

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) { ... } 
} 

変数。

関連する問題