根据我对正常活动的经验,我的印象是,在该onResume()
函数中,您可以对视图执行操作,并且它们已经被渲染到屏幕上。
但是,我现在将我的一些代码转换为 aFragment
并且在onResume()
我调用 a 时view.getWidth()
它返回 0(视图是在 中创建的onCreateView
)。该视图最终会被渲染,但我似乎无法在片段的生命周期中访问它。
这是正常的吗?
根据我对正常活动的经验,我的印象是,在该onResume()
函数中,您可以对视图执行操作,并且它们已经被渲染到屏幕上。
但是,我现在将我的一些代码转换为 aFragment
并且在onResume()
我调用 a 时view.getWidth()
它返回 0(视图是在 中创建的onCreateView
)。该视图最终会被渲染,但我似乎无法在片段的生命周期中访问它。
这是正常的吗?
当 Fragment 回到前台时会调用 onResume,但它不保证它仍然可见或布局已经发生。Fragment 的 onResume 与其 Activity 相关联 - 这是文档的摘录:
请记住,onResume 并不是您的活动对用户可见的最佳指标;系统窗口(例如键盘保护)可能位于前面。使用 onWindowFocusChanged(boolean) 确定您的活动对用户可见(例如,恢复游戏)。
获取视图大小的最佳方法是通过ViewTreeObserver.OnGlobalLayoutListener。一旦布局完成就会调用它,您可以从那里安全地获取视图的大小。
只需在您感兴趣的视图上注册一个 OnGlobalLayoutListener 并在布局发生后获取其大小。一旦您阅读了该值,就应该取消注册您的侦听器并且不关心任何进一步的更新。(否则会多次调用侦听器。)
View v = ... ;
...
v.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
v.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
height = v.getHeight();
width = v.getWidth();
}
});
(注意兼容性检查 - 该方法在 Jelly Bean 中重命名。)
在绘制整个窗口后,视图的尺寸是已知的。由于片段通常是包含在宿主活动布局中的子视图,因此在片段中创建子视图这一事实并不意味着它已添加到父视图中ViewGroup
。