2011-12-07 35 views
19

我有一个后台线程,更新我的活动的UI,在onCreate()之后。它可以添加布局或更改其他大小。如何知道活动何时完成布局过关?

我只是想在我的活动中检测布局通过何时完成,以便能够手动更新其他视图的位置,这些视图直接取决于刚添加或修改的布局。

现在,我只是使用HandlerpostDelayed runnable做一个小小的延迟后,大约50-100毫秒后触发requestLayout()的modifs。

它有效,但我们可以明显看到延迟。我想尽快完成这项工作。在视图代码中,检测测量过程非常简单,但我无法直接在活动中找到解决方法。

回答

39

GlobalLayoutListener将在完成布局时触发事件。这是否适合您的需求?

View myView=findViewById(R.id.myView); 
    myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       //At this point the layout is complete and the 
       //dimensions of myView and any child views are known. 
      } 
     }); 
1

除了菲利普·菲茨西蒙斯接受的答案,这是正确的,我还要指出,如果有人需要知道在视图本身的大小,方法:

protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    // your code here 
} 

可以覆盖和它会在布局过后调用。

+6

虽然这是正确的,但我想补充一点,在某些布局中,可以调用两次或更多次,其中测量过程将被称为递归(重量等)。 – JacksOnF1re

相关问题