首页 > 解决方案 > 变量是从另一个内部类内部的内部类中访问的

问题描述

我在另一个内部类中有一个内部类,我试图在两个内部类之外使用最终变量。这是代码:

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 中工作?

标签: javaandroid

解决方案


现在我看了一下,您的问题可能是 View v 正在作为参数传递给 OnClickListener 的 onClick 方法,并且下面的代码可能试图访问而不是您的顶级 View 变量。

我的建议是重构您的变量名称,以便您引用正确的变量。如果传入的 View 是您真正想要使用的,则应在方法签名中将其声明为 final:

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();
  }
}

如您所见,第二个可运行对象嵌套在另一个可运行对象中,运行代码会访问整数测试并按应有的方式打印它。


推荐阅读