你怎么知道布局是什么时候绘制的?
我有一个自定义的视图,在屏幕上绘制一个可滚动的位图。 为了初始化它,我需要传递父布局对象的像素大小。 但是在onCreate和onResume函数中,布局还没有绘制,所以layout.getMeasuredHeight()返回0。
作为一种解决方法,我添加了一个处理程序来等待一秒钟,然后测量。 这个工作,但它的马虎,我不知道我可以修整时间之前,我最终结束了布局。
我想知道的是,如何检测布局何时被绘制? 有事件还是callback?
你可以添加一个树观察者到布局。 这应该返回正确的宽度和高度。 在子视图的布局完成之前调用onCreate() 。 所以宽度和高度还没有计算。 为了得到高度和宽度,把这个onCreate()方法: 
 final LinearLayout layout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID); ViewTreeObserver vto = layout.getViewTreeObserver(); vto.addOnGlobalLayoutListener (new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { layout.getViewTreeObserver().removeOnGlobalLayoutListener(this); int width = layout.getMeasuredWidth(); int height = layout.getMeasuredHeight(); } }); 
 一个简单的方法是简单地在你的布局上调用post() 。 这将在您的视图已经创build后的下一步运行您的代码。 
 YOUR_LAYOUT.post( new Runnable() { @Override public void run() { int width = YOUR_LAYOUT.getMeasuredWidth(); int height = YOUR_LAYOUT.getMeasuredHeight(); } }); 
为避免不build议使用的代码和警告,您可以使用:
 view.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @SuppressWarnings("deprecation") @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { view.getViewTreeObserver() .removeOnGlobalLayoutListener(this); } else { view.getViewTreeObserver() .removeGlobalOnLayoutListener(this); } yourFunctionHere(); } }); 
另一个答案:尝试检查onWindowFocusChanged的视图尺寸
当onMeasure被调用时,视图获取其测量的宽度/高度。 之后你可以调用layout.getMeasuredHeight()