在支持片段生命周期中,所有视图实际上都显示在屏幕上吗?

When in a support Fragment lifecycle do all view(s) actually get displayed on the screen?

我有一个 Activity 使用 supportFragmentManager 显示各种片段。当我尝试在片段或父 activity 中获取视图,并尝试测量它在屏幕上的位置时,它似乎只能在片段生命周期中的 onResume 之后或 [= 之后的某个时间进行测量12=] 在 Activity 中。通常它在大约 100-200 毫秒后可用。是否有任何生命周期事件 documented/undocumented 或知道何时发生这种情况的可靠方法,例如 canvas 绘图事件。有问题的片段需要测量父 activity 视图,但它并不总是立即在 onResume 中可用。我真的很讨厌不得不做一些 hack,比如让处理程序等待 200 毫秒。

您可以使用 ViewTreeObserver.addOnGlobalLayoutListener().

@Override
public void onCreate(Bundle savedInstanceState) {
    //...
    someView.getViewTreeObserver().addOnGlobalLayoutListener(getOnLayoutListener(someView));
    //...
}

private ViewTreeObserver.OnGlobalLayoutListener getOnLayoutListener(final View unHookView) {
    return new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
                unHookView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            else
                unHookView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            //YOUR CODE HERE
        }
    };
}