我的正常活动经历给我的印象是,在onResume()
函数中你可以对视图执行操作,并且它们已经被渲染到屏幕上了。
但是,我现在将部分代码转换为Fragment
并在片段的onResume()
中调用view.getWidth()
时它返回0(视图在{{ 1}})。该视图最终会被渲染,但我似乎无法在片段的生命周期中访问它。
这是正常的吗?
答案 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
中。