Java 获取视图的高度-需要将变量声明为final

Java 获取视图的高度-需要将变量声明为final,java,android,view,height,Java,Android,View,Height,我想使用TreeObserver方法获取视图的高度: int v1_h; v1.getViewTreeObserver().addOnGlobalLayoutListener(newViewTreeObserver.OnGlobalLayoutListener() { @SuppressLint("NewApi") @SuppressWarnings("deprecation") @Overr

我想使用TreeObserver方法获取视图的高度:

        int v1_h;
        v1.getViewTreeObserver().addOnGlobalLayoutListener(newViewTreeObserver.OnGlobalLayoutListener() {
            @SuppressLint("NewApi")
            @SuppressWarnings("deprecation")
            @Override
            public void onGlobalLayout() {
                //now we can retrieve the width and height

                v1_h = v1.getHeight();


                if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN)
                    v1.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                else
                    v1.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
        });

//Do something with v1_h later on

我想将高度存储在一个变量中,稍后使用。问题是它需要声明为final才能从内部类中访问。所以我把它定为最终版本,但现在它说它不能被分配。有没有办法解决这个问题

最简单的方法是将变量声明为类成员,而不是在堆栈上声明变量。如果将v1_h设置为final,您将无法按照预期的方式使用它。

实际上
v1_h
和您创建的内部类“
new ViewTreeObserver.OnGlobalLayoutListener()…
”在同一范围内,如果要更改
v1_h
的值,则应将声明移动到范围的更高级别,我不知道您的代码到底是如何运行的,但我举了一个例子来理解我所说的:

public class MainActivity extends Activity {
//The scope you should declare your variable in, No need to declare as a final
//Here is an upper level scope than inner class's!
int v1_h;

@Override
    protected void onCreate(Bundle savedInstanceState) {
    ...
    //1.The scope you declared your variable in 
    //2.Where the inner class is
        v1.getViewTreeObserver().addOnGlobalLayoutListener(...)
    //1 && 2 => They were in the same scope in your code
    ...
    }
}

希望它有帮助…

在一个顶级作用域中声明v1_h,你称之为addOnGlobalLayoutListener方法,我不明白。我试着把v1_h放在onGlobalLayout()的上方,就像一个全局变量一样,但是当我在树观察者代码之外时,在下面找不到它。您能解释一下吗?@user1197993不接受我提供的答案的原因吗?是的,我尝试将其设置为全局变量,但在获取高度时它没有更新值。由于某些原因,v1_h中存储的值始终为0,即使getHeight()返回了正确的值。如果您不再出现编译时错误,这是另一个问题,请问另一个问题。