致电Fragment.setRetainInstance(true)
会导致Fragment
保留FragmentManager
,但是View
是否会被保留?我想不是,但我正在寻找确认。我认为不是因为Fragment.onCreateView()
仍在调用(即使onCreate()
不是),并且调用getView()
会返回null
。
如果Fragment
的{{1}}不是,那么保留View
跨配置更改的重点是什么?一个原因是保留数据,以避免昂贵的重新加载,但还有其他方法可以做到这一点。
提前致谢...
答案 0 :(得分:4)
保留的片段是否保留其视图?
这取决于你如何定义它。片段将再次调用onCreateView()
,因此应该为新活动设置其UI。但是,如果您有字段保留小部件,那么这些字段将被保留,并且您的工作是将这些字段指向新的小部件,以避免内存泄漏和其他问题。
如果视图不是,那么在配置更改中保留片段有什么意义?
保留数据,避免昂贵的重新加载。
但还有其他方法可以做到这一点
仅限于限制。
例如,在其他条件相同的情况下,最好通过已保存的实例状态Bundle
保留数据。但是,Bundle
无法保留任意对象(例如,Camera
),并且Bundle
的大小限制为~1MB,因此无法保留大对象(例如,照片)。
术语“保留”的部分原因是保留的片段构建在onRetainNonConfigurationInstance()
上的旧Activity
回调之上。现在是final
,不能使用,IIRC。
生命比当前活动更广泛的数据可以全局缓存(例如,数据库/网络I / O结果的POJO缓存,图像缓存)。但是,某些内容(如Camera
)不属于此类静态数据成员。
使用Loader
框架检索的内容(例如,通过CursorLoader
)会自动保留,但Loader
框架对CursorLoader
以外的内容有其自身的问题。
你没有拥有来使用保留的片段。我发现它们非常有用。
答案 1 :(得分:0)
我通常在非UI片段(未实现setRetainInstance
)上使用onCreateView
。我委托冗长的操作(例如服务器上的api调用),以便它们在配置更改(屏幕旋转)期间仍然发生,当我的UI恢复时,我可以连接回保留的片段以获得结果/进度。