我有一个自定义视图,绘制一个可滚动的位图到屏幕。为了初始化它,我需要传入父布局对象的像素大小。但是在onCreate和onResume函数期间,布局还没有绘制,因此Layout . getmeasuredheight()返回0。
作为一种变通方法,我添加了一个处理程序来等待一秒钟,然后进行测量。这是工作,但它草率,我不知道多少我可以修剪的时间之前,我结束之前的布局得到绘制。
我想知道的是,我如何检测当一个布局被绘制?是否有事件或回调?
我有一个自定义视图,绘制一个可滚动的位图到屏幕。为了初始化它,我需要传入父布局对象的像素大小。但是在onCreate和onResume函数期间,布局还没有绘制,因此Layout . getmeasuredheight()返回0。
作为一种变通方法,我添加了一个处理程序来等待一秒钟,然后进行测量。这是工作,但它草率,我不知道多少我可以修剪的时间之前,我结束之前的布局得到绘制。
我想知道的是,我如何检测当一个布局被绘制?是否有事件或回调?
当前回答
另一个答案是: 试着检查onWindowFocusChanged上的视图维度。
其他回答
当onMeasure被调用时,视图得到它测量的宽度/高度。在此之后,你可以调用layout.getMeasuredHeight()。
如果您正在使用kotlin,我建议您使用doOnLayout
doOnLayout {
doWhateverYouNeed()
}
道格: 在布局此视图时执行给定的操作
您可以在布局中添加一个树形观察器。这将返回正确的宽度和高度。onCreate()在完成子视图的布局之前被调用。所以宽度和高度还没有计算出来。要获得高度和宽度,将其放在onCreate()方法上:
final LinearLayout layout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID);
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnGlobalLayoutListener (new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
layout.getViewTreeObserver()
.removeOnGlobalLayoutListener(this);
} else {
layout.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
}
int width = layout.getMeasuredWidth();
int height = layout.getMeasuredHeight();
}
});
另一个答案是: 试着检查onWindowFocusChanged上的视图维度。
一个非常简单的方法是在布局上调用post()。这将在创建视图之后运行您的代码。
YOUR_LAYOUT.post( new Runnable() {
@Override
public void run() {
int width = YOUR_LAYOUT.getMeasuredWidth();
int height = YOUR_LAYOUT.getMeasuredHeight();
}
});