我通过代码创建视图层次结构,然后setContentView()
在 Activity 中使用我的根视图(如参数)进行操作。
我需要在运行时知道一个视图的宽度和高度,但如果我知道getWidth()
或getHeight()
,我得到 0。如果我等待几秒钟,我得到正确的宽度或高度。
我只想知道android在什么时候计算视图的宽度/高度。我的代码并不出色
谢谢!
这是因为onCreate()
尚未计算布局。因此,您需要添加一个GlobalLayoutListener
以了解何时计算布局并将其放置在屏幕中。
final View view = findViewById(R.id.root);
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewTreeObserver vto = view.getViewTreeObserver();
vto.removeGlobalOnLayoutListener(this);
}
});
其中 root 是根布局(LinearLayout、RelativeLayout 即)。使用@+id/root 分配您的根布局。
您没有说您要在哪里测量视图,但我的猜测是它在 onCreate() 或 onResume()>
在你的 onCreate() 中试试这个。
// set a global layout listener which will be called when the layout pass is completed and the view is drawn
mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
// measure your views here
}
}
这里,mainLayout 是对布局的根视图组的引用。
如果布局在第一次绘制后调整大小(在代码中添加视图、方向更改等),也会调用此方法,因此您将始终获得正确的值。
您可以使用一些 View 类。添加这个:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super(w,h,oldw,oldh);
if(oldw == 0 && w !=0){
...
// w and h is what you want
}