我在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
的宽度。
提前致谢)
答案 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);
}