2015-10-12 6 views
0

Я использую анимацию, чтобы скрыть вид в верхней части экрана. Код анимации содержится в методе LoopAnimation(), который вызывается из основного.Невозможно получить доступ к глобальной конечной переменной из внутреннего класса

public class MainActivity extends AppCompatActivity { 

final View view = findViewById(R.id.view); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    LoopAnimation(view); \\ The animation loop method 

} 

Этот LoopAnimation() метод использует вложенную setOnClickListener создать цикл анимации

public void LoopAnimation(View view){ 
    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // starts the animation 
      view.animate().translationY(-100); 
      view.animate().setDuration(1500); 

      // reverses the animation 
      view.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        // Do some job here 
        view.animate().translationY(100); 
        view.animate().setDuration(1500); 

        LoopAnimation(view); // Method calls itself 
             // to create loop effect 

       } 
      }); 

     } 
    }); 
} 

Проблема заключается в том, что я получаю тривиальную ошибку, которую я не могу понять. Хотя я объявил view как глобальные и окончательные, я получаю эту ошибку в LoopAnimation()

Variable 'view' is accessed from within inner class, needs to be declared final. 
+1

RogueBaneling ответил на ваш конкретный вопрос. Вы также обнаружите, что 'view' является нулевым, потому что вы не можете использовать' findViewById (...) 'до тех пор, пока не вызвали' setContentView (...) '. –

+0

@KevinKrumwiede Спасибо. Итак, есть 3 способа сделать это (1) Я делаю глобальную ссылку и сбрасываю объект, на который он указывает каждый раз, или (2) каждый раз создаю новую локальную переменную с новой ссылкой (3), используя ключевое слово 'this'? –

+0

Ничего из перечисленного. Ваша ссылка не является глобальной и не требуется. Также не обязательно быть «последним». Удалите локальную переменную (параметр метода), которая скрывает член класса, и просто обратитесь к члену класса как 'view'. –

ответ

3

Вы используете переменную view, которая определена в рамках вашего метода. Обратите внимание, что параметр вашего метода также называется view, поэтому вы фактически не используете глобальную переменную, которую, по вашему мнению, используете.

public void LoopAnimation(View view){ 

Edit: Я смотрел больше в пути, что вы пытаетесь сделать это, и подход не то, что я буду делать. Вот что более разумно:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     View view = findViewById(R.id.view); 
     view.setOnClickListener(new View.OnClickListener() { 

      private boolean _forwards = true; 

      @Override 
      public void onClick(View v) { 
       if (_forwards) { 
        // starts the animation 
        v.animate().translationY(-100); 
        v.animate().setDuration(1500); 
        _forwards = false; 
       } else { 
        // reverses the animation 
        v.animate().translationY(100); 
        v.animate().setDuration(1500); 
        _forwards = true; 
       } 
      } 
     } 
    } 
} 
+0

Спасибо. Итак, каков наиболее эффективный способ оживить представление. Мне просто нужно создать новый объект 'view' каждый раз, когда я вызываю другой метод, например. 'View view = findViewById (R.id.view)'? –

+0

Я обновил свой ответ с помощью более чистого подхода к тому, что я думаю, что вы пытаетесь достичь. – RogueBaneling