addOnGlobalLayoutListener和onWindowFocusChanged之间的区别?

use*_*104 5 android textview relativelayout imageview android-layout

目前我有几个视图,屏幕分为两个部分

例:

text1     image1

text2

text3

text4
Run Code Online (Sandbox Code Playgroud)

问题是,如果image1很高,它将与左侧的textview重叠,所以我用左边强制textview宽度不超过imageview的左边.

 android:layout_toLeftOf="@id/imageView1" 
Run Code Online (Sandbox Code Playgroud)

但是,每个textview都与imageview的左边对齐,因为在创建视图之前我不知道它的高度.我希望在imageview基线下面的所有textview删除布局规则android:layout_toLeftOf

所以我搜索解决方案并找到两种方法?

1.onWindowFocusChanged

2.getViewTreeObserver().addOnGlobalLayoutListener
Run Code Online (Sandbox Code Playgroud)

两者都可以获得视图的y轴.

问题是:

 1. what is the difference between them ?

 2. I tried approach 2 , but it is not working, how to fix it? 
Run Code Online (Sandbox Code Playgroud)

码:

        image.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            ImgY = image.getY();
        }
    });

    lng.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (lng.getY() > ImgY) {
                lng.removeRule(RelativeLayout.LEFT_OF);
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

错误是我想设置一个全局值来存储imageview的y,但它警告The final local variable ImgY cannot be assigned, since it is defined in an enclosing type同样,removeRule函数返回

 The method removeRule(int) is undefined for the type TextView
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助.