Ошибка при изменении переменной - PullRequest
0 голосов
/ 03 апреля 2012

У меня проблема с кусочком кода:

        // Feld 1 OnClick int punkte;
    int punkte;
    punkte=0;
    TextView counter = (TextView) findViewById(R.id.counter);
    counter.setText(Integer.toString(punkte));

    TextView next = (TextView) findViewById(R.id.Farbent1);
    next.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            punkte=punkte+1;
        };
    });

Когда я спрашиваю Eclipse, он говорит, что я должен сделать «пункт» в публичном void onClick (View View) до финального int. Но когда это окончательно, я не могу изменить переменную Я не вижу причины, по которой я должен сделать свою переменную final. И есть ли решение изменить мою переменную в onClick (View View)? лучшие реграды безымянный

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Чтобы сослаться на локальную переменную внутри обратного вызова (метод onClick ()), эта переменная должна быть объявлена ​​как "финальная", чтобы компилятор знал, что ссылка на нее не изменится.

Вы можете легко обойти эту проблему, сделав пункт в поле уровня класса.

private int punkte = 0;

private void myMethod(){

    TextView counter = (TextView) findViewById(R.id.counter);
    counter.setText(Integer.toString(punkte));

    TextView next = (TextView) findViewById(R.id.Farbent1);
    next.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            punkte=punkte+1;
        };
    });

}
1 голос
/ 03 апреля 2012

Область действия переменной ограничена функцией, в которой вы все это объявляете (предположительно onCreate()?). Это означает, что переменная обычно уничтожается в конце функции (делая ее недоступной для слушателя onClick), но если вы объявите ее как final, компилятор может, в некотором смысле, обмануть и сохранить ее. Если вы хотите сохранить переменную для использования вне вашей функции, она должна быть переменной класса.

public class MyClass extends Activity{
  private int punkte = 0;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    //Do stuff ...
    TextView counter = (TextView) findViewById(R.id.counter);
    counter.setText(Integer.toString(punkte));

    TextView next = (TextView) findViewById(R.id.Farbent1);
    next.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
          punkte=punkte+1;
      }
    });
  }
}
...