2012-08-08 75 views
4

我得到了一个视图的高度和宽度,在getView()方法中夸大了。这是一个网格项目。为什么在post()runnable中查看宽度和高度为0?

通常,我在视图上使用post()以获取大小,然后将其连接到布局。但它返回0

final View convertViewFinal = convertView; 
convertView.post(new Runnable() { 
    @Override 
    public void run() { 
     doSomethingWithConvertView(convertViewFinal); 
    } 
}); 

...

doSomethingWithConvertView(View v) {v.getWidth(); /*returns 0*/}; 

如何获得的大小?

回答

0

事情是,convertview很可能不是在手机屏幕上绘制,所以你必须等到它准备好。

您需要使用ViewTreeObserver来准确知道视图何时被绘制。

检查这个答案的详细信息: When Can I First Measure a View?

0

你可能在的onCreate或在onStart或调用的onResume此,方法哪种布局措施之前运行。 但是有很多变通的,这是一个不错的选择:

ViewTreeObserver vto = rootView.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      public void onGlobalLayout() { 
       v.getWidth();//already measured... 
      } 
     }); 

凡rootView可以是任何的ViewGroup在一个比一个更高的水平,你想要的宽度。 但请注意,此列表器可能会运行多次。

1

边使用viewTreeObserver肯定能行,我发现,在膨胀的观点调用测量要求能可靠地使用可运行从活动的观点来完成。即

someActivityInstance.getWindow().getDecorView().post(new Runnable() { 
    @override 
    public void run() { 
     // someMeasurements 
    } 
}); 
相关问题