2

我通过代码创建视图层次结构,然后setContentView()在 Activity 中使用我的根视图(如参数)进行操作。

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

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

谢谢!

4

4 回答 4

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 分配您的根布局。

于 2013-06-13T11:11:57.533 回答
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 是对布局的根视图组的引用。

如果布局在第一次绘制后调整大小(在代码中添加视图、方向更改等),也会调用此方法,因此您将始终获得正确的值。

于 2013-06-13T11:11:47.523 回答
1

您可以使用一些 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
    }
于 2013-06-13T12:45:35.040 回答
0

为清楚起见,根据此Android 文档

当一个 Activity 获得焦点时,它会被请求绘制它的布局。

...并且还测量视图尺寸。

焦点在方法之后接收onResume和失去它onPause

于 2013-06-13T11:29:12.190 回答