我有一个自定义视图,绘制一个可滚动的位图到屏幕。为了初始化它,我需要传入父布局对象的像素大小。但是在onCreate和onResume函数期间,布局还没有绘制,因此Layout . getmeasuredheight()返回0。

作为一种变通方法,我添加了一个处理程序来等待一秒钟,然后进行测量。这是工作,但它草率,我不知道多少我可以修剪的时间之前,我结束之前的布局得到绘制。

我想知道的是,我如何检测当一个布局被绘制?是否有事件或回调?


当前回答

我创建静态变量来检查布局是否已经绘制。如果它已经创建,你可以简单地调用绘制的函数。

static int firstAccess = 0;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main8);

    if (firstAccess==0) {
        LAYOUT_YOU_DRAW.post(new Runnable() {
            @Override
            public void run() {
                creatSpread();
                firstAccess = 1;
            }
        });
    }else{
        creatSpread();
    }
}

其他回答

一个非常简单的方法是在布局上调用post()。这将在创建视图之后运行您的代码。

YOUR_LAYOUT.post( new Runnable() {
    @Override
    public void run() {
        int width  = YOUR_LAYOUT.getMeasuredWidth();
        int height = YOUR_LAYOUT.getMeasuredHeight(); 
    }
});

视图。post {TODO(“尚未实现”)}

当onMeasure被调用时,视图得到它测量的宽度/高度。在此之后,你可以调用layout.getMeasuredHeight()。

如果您正在使用kotlin,我建议您使用doOnLayout

doOnLayout {
    doWhateverYouNeed()
}

道格: 在布局此视图时执行给定的操作

我创建静态变量来检查布局是否已经绘制。如果它已经创建,你可以简单地调用绘制的函数。

static int firstAccess = 0;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main8);

    if (firstAccess==0) {
        LAYOUT_YOU_DRAW.post(new Runnable() {
            @Override
            public void run() {
                creatSpread();
                firstAccess = 1;
            }
        });
    }else{
        creatSpread();
    }
}