Android Fragments生命周期:在绘制视图后如何做某事?

时间:2013-01-07 22:19:58

标签: android android-fragments lifecycle

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

但是,我现在将部分代码转换为Fragment并在片段的onResume()中调用view.getWidth()时它返回0(视图在{{ 1}})。该视图最终会被渲染,但我似乎无法在片段的生命周期中访问它。

这是正常的吗?

2 个答案:

答案 0 :(得分:1)

当片段返回到前台时,会调用

onResume,但它不能保证它仍然可见或者布局已经发生。片段的onResume与其活动相关联 - 这是the documentation的摘录:

  

请记住,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中重命名。)

答案 1 :(得分:0)

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