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



我通过代码创建我的视图层次结构,然后我用我的根视图在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方法后丢失

最新更新