保留的片段是否保留其视图?

Does a retained Fragment retain its View?

调用Fragment.setRetainInstance(true)会导致FragmentFragmentManager保留,但是View保留了吗?我认为不是,但我正在寻找确认。我认为不是因为 Fragment.onCreateView() 仍然被调用(即使 onCreate() 不是)并且调用 getView() returns null.

如果 View 不是,那么在配置更改中保留 Fragment 有什么意义?一个原因是保留数据,以避免昂贵的重新加载,但还有其他方法可以做到这一点。

提前致谢...

我通常在非 UI 片段(未实现 onCreateView)上使用 setRetainInstance。我委托冗长的操作(例如 api 在服务器上调用),以便它们在配置更改(屏幕旋转)期间仍然发生,并且当我的 UI 恢复时我可以连接回保留的片段对于 result/progress.

Does a retained Fragment retain its View?

这取决于你如何定义它。该片段将再次调用 onCreateView(),因此它应该为新的 activity 设置其 UI。但是,如果您有字段保留在小部件上,那么这些字段将被保留,并且您的工作是让这些字段指向新的小部件,以避免内存泄漏和其他问题。

What is the point of retaining a Fragment across configuration changes if its Views aren't?

保留数据,避免昂贵的重新加载。

but there are other ways to do that

只有限制。

例如,在其他条件相同的情况下,最好通过保存的实例状态来保留数据Bundle。但是,Bundle 无法保存任意对象(例如 Camera),并且 Bundle 的大小有 ~1MB 的限制,因此它无法保存大对象(例如,一张照片)。

"retain" 一词的部分原因是保留片段构建在 Activity 上的旧 onRetainNonConfigurationInstance() 回调之上。那现在是 final,无法使用,IIRC。

生命周期比当前 activity 更广泛的数据可以全局缓存(例如,database/network I/O 结果的 POJO 缓存、图像缓存)。但是,有些东西,例如 Camera,不属于静态数据成员。

您使用 Loader 框架(例如,通过 CursorLoader)检索的内容会自动保留,但 Loader 框架对于 [=20= 以外的内容有其自身的问题].

没有使用保留片段。我发现它们相当有用。