Переменная доступна изнутри внутреннего класса внутри другого внутреннего класса - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть внутренний класс в другом внутреннем классе, в котором я пытаюсь использовать конечную переменную вне обоих внутренних классов. Вот код:

final View v = inflater.inflate(R.layout.fragment_floor_plan, container, false);  //final variable
final Button button0 = v.findViewById(R.id.button21);    
button0.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
                   final PhotoView photoView = v.findViewById(R.id.photo_view);   //works fine here
                   photoView.setAlpha(0f);                                  
                   System.out.println(photoView.isZoomable());
                   System.out.println(photoView.VISIBLE);

                   photoView1.animate().alpha(0f).setDuration(250);
                   photoView.animate().alpha(1f).setDuration(250);
                   photoView.bringToFront();    

                   photoView.setOnScaleChangeListener(new OnScaleChangedListener() {
                       @Override
                       public void onScaleChange(float scaleFactor, float focusX, float focusY) {
                           if (photoView.getScale() <= photoView.getMinimumScale() + 0.1f) {
                               LinearLayout linearLayout = v.findViewById(R.id.linearLayout); //doesn't work here
                               linearLayout.bringToFront();
                           } 
                       }
                   }
           }
});

Как заставить его работать внутри OnScaleChangedListener?

1 Ответ

1 голос
/ 15 апреля 2020

Теперь, когда я посмотрю на него, ваша проблема может заключаться в том, что View v передается в качестве параметра методу onClick объекта OnClickListener, и приведенный ниже код может пытаться получить доступ вместо вашей переменной View верхнего уровня.

Я бы рекомендовал реорганизовать имена переменных, чтобы вы ссылались на правильную переменную. Если переданное представление является тем, которое вы фактически хотите использовать, оно должно быть объявлено как окончательное в сигнатуре метода:

public void onClick(final View v) {

Если переменная во вложенной области видимости вложенного анонимного класса объявляется окончательным или фактически окончательным, вы просто должны иметь доступ к нему из любого уровня вложенных внутренних анонимных классов.

Чтобы убедиться в этом, я сделал небольшой пример и попробовал сам:

import java.util.function.*;

public class Main {
  public static void main(String[] args) {
    final int test = 11;
    Runnable runnable = new Runnable() {
      public void run() {
        Runnable runnable = new Runnable() {
          public void run() {
            System.out.println(test);
          }
        };
        runnable.run();
      }
    };
    runnable.run();
  }
}

Как вы можете видеть, второй исполняемый файл вложен в другой исполняемый файл, и выполнение кода обращается к целочисленному тесту и печатает его, как следует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...