当android计算视图的宽度和高度时

时间:2013-06-13 11:00:08

标签: android height width

我按代码创建了我的视图层次结构,然后在活动中使用我的根视图(如参数)进行setContentView()

我需要在运行时知道一个视图的宽度和高度,但如果我做getWidth()getHeight(),我得到0.如果我等了几秒钟,我得到正确的宽度或高度。

我只想知道android在什么时候计算视图的宽度/高度。我的代码不是很出色

谢谢!

4 个答案:

答案 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
    }