你怎么知道布局是什么时候绘制的?

我有一个自定义的视图,在屏幕上绘制一个可滚动的位图。 为了初始化它,我需要传递父布局对象的像素大小。 但是在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()