2016-06-25 9 views
-1

私は理解していないこのメソッドを持っています。 この質問で重要な2つのグローバル変数:Android-メソッドは変数の値を永久に変更しています

-mNextButton; -mCurrentIndex;

mNextButton.setOnClickListener(new View.OnClickListener() { 
      @Override 

      public void onClick(View v) { 

       mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length; 

      int questionID = nameOfArray[mCurrentIndex].getQuestion(); 
     mQuestionTextView.setText(question); 
      } 
     }); 

ユーザーがmNextButtonをクリックするたびにmCurrentIndexが永久に増加する可能性はありますか?

答えて

1

具体的になるようにしてください。あなたは本当に何を知っていますか? コードでは、ユーザーがボタンを押したときに呼び出されるコールバックを設定します。あなたは「グローバル」変数を更新するコードの中に、これは正確に同じ特定mCurrentIndexを更新します

mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;

(javaは何のグローバル変数を持っていないので、私はあなたが活動の内部クラスのフィールド変数を意味すると仮定します) - それはインデックスを増やします値がmQuestionBank.lengthより大きくなると、1つを除き、折り返します。 %は標準modulo operatorです。

mQuestionBank.lengthパラメータを確認したり、より良い質問を書いてください。がんばろう。

+0

mQuestionBankは配列の名前です。ごめんなさい。 変数mCurrentIndexがメソッドonClickの終了後に値をどのように変更できるかを知りたいだけです。 メソッド呼び出しの前に1の値を持ち、メソッドが2に変更された場合、メソッドが終了した後に再度1の値を持たないはずですか? – Zgodni

+1

簡単な答え - いいえ、それは=ではない)説明しようとすると、ローカルとグローバルの2種類の変数があります。 locals - 関数内で定義する変数です。それらはメソッドの実行中に作成され、その後は削除されます。グローバル変数 - 異なるもの。クラスフィールド変数などです。クラスインスタンスを作成したときに作成されたメソッドで、値を変更するメソッドがあると、メソッドの実行後も変更が残ります。私は、javaやその他のプログラミング言語に関する基本的な本を読むことをお勧めします。 –

+0

これをクリアするのに役立つには、関数の_outside_を作成した変数( 'mCurrentIndex')を使用しているので、それは存在し続けて同じ値を持ちます。変数が関数の内部で作成された場合は、 'onClick()'が –

0

これを解決するには、ローカル変数を1つ設定する必要があります。だからあなたのonClickメソッドで: -

int mCIndex = mCurrentIndex; 

mCIndex = (mCIndex + 1) % mQuestionBank.length; 



    int questionID = nameOfArray[mCIndex].getQuestion(); 
    mQuestionTextView.setText(question 

); 

mCurrentIndexのそれは

+0

と呼ばれるたびに作成されますが、投稿したコードが欲しいものではありません。 mQuestionBankは配列の名前で、ユーザーがmNextButtonをクリックするたびにmCurrentIndexが変更されます – Zgodni

+0

次に何が問題なのですか?同じレートでmCurrentIndexが増加するのでしょうか? –

0

ザッツ値は、すべてのmNextButtonをクリックして

(mCurrentIndex+1) % mQuestionBank.length 

の値に設定されています。 この値は、mCurrentIndexとmQuestionBankの長さに依存します。動作を説明するために、モジュロ演算子を見てみましょう:

https://en.m.wikipedia.org/wiki/Modulo_operation

は短いそれをカットするには:mCurrentIndexは、例えば4の値を持つ場合 、それが1つインクリメントだとあなたは今、5 を取得し、それはあなたのmQuestionBankの長さに依存します。それが2000なら、それは0-1999の残余クラスを持つでしょう。あなたが2000年までにモジューロする数はすべて、これらのクラスの1つになります。 0を2000で割った値に余りがないため、0 mod 2000が0に等しい演算を行うと、 2000で割った1 2000は、あなたのケース5. に等しくなります。1.そして5 MODの残りは0であるため、 1 MOD 2000は、1:mCurrentIndexは

mCurrentIndex+1 = mQuestionBank.lenght 

まで、すべてのクリックで大きくなり、その後理由再び0で始まります。この例では、2000 mod 2000は1であり、余りはありません。

関連する問題