Android ViewTreeObserver.OnGlobalLayoutListener遇到了麻烦

时间:2015-07-06 14:19:08

标签: android view

我在ViewTreeObserver.OnGlobalLayoutListener方法中使用onCreate()来获取布局的宽度。它工作得很好,但是当我在onGlobalLayout()中使用变量进行操作时,回调更改不会超出它。

例如,当我在Activity的字段中保存Layout的宽度时,它会在onGlobalLayout()方法之外默认返回上一个值或值(在我的情况下为0)。当我更改变量的参考时,它们将在方法之外为空。

layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
    width = layout.getWidth(); // width - activity's field
    Log.d("myLogs", width); //return rigth value
}
});
Log.d("myLogs", width); //return 0

我不知道如何处理它,也许我需要以另一种方式获得Layout的宽度。

提前致谢)

3 个答案:

答案 0 :(得分:4)

您为OnGlobalLayoutListener传递ViewTreeObserver,并且全部,方法onGlobalLayout未立即调用,将调用此布局发生布局事件。因此,方法addOnGlobalLayoutListener会立即收到width变量值。

答案 1 :(得分:0)

@busylee说对了。

然后,如果要在ViewTreeObserver外部访问此值,解决方案是:

private int width;

layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        int w = layout.getWidth(); // width - activity's field
        Log.d("myLogs", w); //return rigth value
        setWidth(w);
    }
});

private void setWidth(int w) {
    this.width = w;  //get rigth value
    Log.d("myLogs", width);
}

答案 2 :(得分:0)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_account);

    topOfScreen = findViewById(R.id.spc_account_top);
    icon = findViewById(R.id.img_account_icon);

    //[...]


    getPosition();
}

void getPosition(){
    topOfScreen.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int[] pos = new int[2];
            topOfScreen.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            topOfScreen.getLocationOnScreen(pos);
            setAnimation(-1*pos[0]);
            Log.d("X and Y Point", pos[0] + " "+ pos[1]);
        }
    });
}

public void setAnimation(int y) {
    icon.animate().translationYBy(y).setDuration(1500);
    screen.animate().setDuration(2000).alpha(1);
}