我有一些像这样的代码:
final int height = 0; //I want to get this height after Predraw view
view.addOnPreDrawListener(new OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
int myHeight = itemLayout.getMeasuredHeight();
height = myHeight; //this line has error
return false;
}
});
问题是我如何从听众那里获得价值(特别是原始类型)。它始终显示
Cannot refer to a non-final variable height inside an inner class defined in a different method
然后我尝试将变量更改为final,它显示错误:
The final local variable height cannot be assigned, since it is defined in an enclosing type
我不知道为什么API难以使用。
答案 0 :(得分:3)
在int myHeight;
之前将其声明为全球 onCreate(....)
答案 1 :(得分:2)
您不能在高度初始化时使用“final”,然后尝试稍后更改它。但是,您可以将变量分配给类而不是函数。
private int tmpHeight = 0;
这将允许您从侦听器中访问变量。
答案 2 :(得分:2)
您提到的两个错误都是正确的
1)在内部类
中无法访问非final变量2)初始变量在初始化后无法更改
将高度声明为类中的全局变量,而不是在任何方法中将解决您的问题
int myHeight;
答案 3 :(得分:2)
解决此问题的最简单方法是让Activity
实施OnPreDrawListener
。
public class MyActivity extends Activity implements OnPreDrawListener{
int height;
method(){
..
view.addOnPreDrawListener(this);
..
}
@Override
public boolean onPreDraw(){
height = itemLayout.getMeasuredHeight();
}
}
问题不在于API的“复杂性”。这是关于所涉及的各种变量的生命的真正的Java问题。通过不声明变量height
final,它可能会在内部匿名类尝试访问它时从堆栈中清除。必须标记final
,您才被迫保证height
的生命。
通过执行我的建议,您将等同于Activity对象和侦听器Object的生命周期。
答案 4 :(得分:1)
使它成为类级变量也是一种选择。
答案 5 :(得分:1)
错误不在监听器中,它在height
的声明中作为最终变量。
这意味着它在初始化后无法更改,你必须从中删除最终版本:
int height = 0;
view.addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
int myHeight = itemLayout.getMeasuredHeight();
height = myHeight;
return false;
}
});