如何判断布局何时绘制?

新手上路,请多包涵

我有一个自定义视图,可将可滚动位图绘制到屏幕上。为了初始化它,我需要传入父布局对象的像素大小。但是在 onCreate 和 onResume 函数中,Layout 还没有被绘制出来,所以 layout.getMeasuredHeight() 返回 0。

作为一种解决方法,我添加了一个处理程序来等待一秒钟然后测量。这可行,但它很草率,我不知道在绘制布局之前我可以修剪多少时间。

我想知道的是,如何检测何时绘制布局?有事件或回调吗?

原文由 Plastic Sturgeon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 657
2 个回答

您可以将树观察者添加到布局中。这应该返回正确的宽度和高度。 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();

        }
    });

原文由 blessanm86 发布,翻译遵循 CC BY-SA 4.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();
    }
}

原文由 Adrian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题