Java 从附加的OnPreDrawListener对象获取ViewTreeObserver对象

Java 从附加的OnPreDrawListener对象获取ViewTreeObserver对象,java,android,android-layout,observers,Java,Android,Android Layout,Observers,如何让观察者进入监听器? 例如: 要么将其设置为最终值,要么将其声明为实例变量,即在onCreate之前声明它,并将其初始化onCreate final ViewTreeObserver myObserver = myLayout.getViewTreeObserver(); 是由annonymous内部类实现的接口。因此,要访问变量,它必须是final我已经尝试使用listener实例, 我不知道它有多准确,但它是有效的:) 然后我打电话 ViewTreeObserver observer

如何让观察者进入监听器? 例如:


要么将其设置为最终值,要么将其声明为实例变量,即在
onCreate
之前声明它,并将其初始化
onCreate

final ViewTreeObserver myObserver = myLayout.getViewTreeObserver();


是由annonymous内部类实现的接口。因此,要访问变量,它必须是
final

我已经尝试使用listener实例, 我不知道它有多准确,但它是有效的:)

然后我打电话

ViewTreeObserver observer = myLayout.getViewTreeObserver();
MyOnPreDrawListener myListener = new MyOnPreDrawListener();
myListener.setMyLayout(myLayout);
observer.addOnPreDrawListener(myListener);

使
myObserver
成为
final
变量…非常感谢,我将尝试向OnPreDrawListener扩展对象添加实例变量。@Hovo实例变量意味着您必须在创建时将其声明在外部,如
ViewTreeObserver myObserver
然后在
onCreate
中初始化它。明白了,您指的是onCreate方法所属的实例,而不是侦听器实例。@Hovo读取java文档匿名类无法访问其封闭范围内未声明为final或有效final的局部变量。这就是为什么我要你做最后的决定。第二种方式声明您的relatvie布局和
ViewTreeObserver myObserver在onCreate之前,它会工作。我知道什么是final,但我们不能让每个局部变量都是final,因为我们不能在内部匿名代码中访问它们。当我希望JVM不允许任何人和我更改该变量时,我使用final。同样,我们不能将区域设置变量设置为对象的字段
final class MyOnPreDrawListener implements OnPreDrawListener
{
    private RelativeLayout myLayout;

    public void setMyLayout(RelativeLayout layout){
        myLayout = layout;
    }

    @Override
    public boolean onPreDraw() {
        // now I have myLayout here         
        return true;
    }

}
ViewTreeObserver observer = myLayout.getViewTreeObserver();
MyOnPreDrawListener myListener = new MyOnPreDrawListener();
myListener.setMyLayout(myLayout);
observer.addOnPreDrawListener(myListener);