如何知道活动何时完成布局传递?

时间:2011-12-07 16:30:35

标签: android android-layout android-activity

我有一个后台线程,在onCreate()之后更新我的活动的UI。它可以添加布局,也可以更改其他布局。

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

目前,我只是使用Handler postDelayed runnable来完成工作,经过一小段延迟后,在触发requestLayout()的修改后大约50-100毫秒。

它有效,但我们显然可以看到延迟。我想尽快完成这项工作。在视图代码中,检测测量过程很简单,但我没有找到如何在活动中直接解决这个问题。

3 个答案:

答案 0 :(得分:44)

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 :(得分:2)

除了Phillip Fitzsimmons接受的答案,这是正确的,我还要注意,如果有人需要知道视图本身的大小,方法:

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

,并在布局传递后调用它。

答案 2 :(得分:0)

您可以使用ViewTreeObserver.OnPreDrawListener

根据https://developer.android.com/reference/android/view/ViewTreeObserver.OnPreDrawListener上的文档

  

这时,树中的所有视图都已测量并给出了框架。

仅当树中的视图请求另一遍布局时,任何布局边界才会更改。您还可以使用类似的技术,通过ViewTreeObserver.OnDrawListener来获取回调信息

myView.getViewTreeObserver().addOnPreDrawListener(
    new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            myView.getViewTreeObserver().removeOnPreDrawListener(this);
            // view is measured and laid out
        });