我通过代码创建我的视图层次结构,然后我用我的根视图在Activity中做setContentView()
。
我需要知道一个视图的宽度和高度在运行时,但如果我做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
}
为清楚起见,根据Android文档
当一个Activity接收到焦点时,它将被请求绘制它的布局。
…还可以测量视图尺寸
焦点在onResume
方法后接收,在onPause
方法后丢失