【问题标题】:How to know when an activity finishes a layout pass?如何知道活动何时完成布局传递?
【发布时间】:2012-01-15 04:10:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-layout android-activity


    【解决方案1】:

    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.
                }
            });
    

    【讨论】:

    • 我刚刚运行了一个测试,它似乎在初始布局中至少调用了 3 次 onGlobalLayout
    【解决方案2】:

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

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

    可以被覆盖,它会在布局通过后被调用。

    【讨论】:

    • 虽然这是正确的,但我想补充一点,在某些布局中可以调用两次甚至更频繁,其中将递归调用测量过程(权重等)。
    【解决方案3】:

    您可以使用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
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多