我按代码创建了我的视图层次结构,然后在活动中使用我的根视图(如参数)进行setContentView()
。
我需要在运行时知道一个视图的宽度和高度,但如果我做getWidth()
或getHeight()
,我得到0.如果我等了几秒钟,我得到正确的宽度或高度。
我只想知道android在什么时候计算视图的宽度/高度。我的代码不是很出色
谢谢!
答案 0 :(得分:3)
这是因为在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分配根布局。
答案 1 :(得分:2)
你没有说你在哪里测量视图,但我的猜测是在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是对布局的根视图组的引用。
如果布局在首次绘制后调整大小(在代码中添加了视图,方向更改等),也会调用此方法,因此您将始终获得正确的值。
答案 2 :(得分:0)
为清楚起见,根据此Android documentation
当一个活动获得焦点时,将要求它绘制它 布局。
...还可以测量视图尺寸。
焦点在onResume
之后收到,并在onPause
方法之后丢失。
答案 3 :(得分:0)
您可以使用某些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
}