1

根据我对正常活动的经验,我的印象是,在该onResume()函数中,您可以对视图执行操作,并且它们已经被渲染到屏幕上。

但是,我现在将我的一些代码转换为 aFragment并且在onResume()我调用 a 时view.getWidth()它返回 0(视图是在 中创建的onCreateView)。该视图最终会被渲染,但我似乎无法在片段的生命周期中访问它。

这是正常的吗?

4

2 回答 2

2

当 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 中重命名。)

于 2013-01-08T05:23:27.057 回答
0

在绘制整个窗口后,视图的尺寸是已知的。由于片段通常是包含在宿主活动布局中的子视图,因此在片段中创建子视图这一事实并不意味着它已添加到父视图中ViewGroup

于 2013-01-07T22:33:32.047 回答