在android中的Listener中获取价值

时间:2012-05-15 09:09:48

标签: java android listener

我有一些像这样的代码:

 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难以使用。

6 个答案:

答案 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;
    }
});