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

时间:2015-08-12 23:49:18

标签: android android-fragments fragmentmanager

致电Fragment.setRetainInstance(true)会导致Fragment保留FragmentManager,但是View是否会被保留?我想不是,但我正在寻找确认。我认为不是因为Fragment.onCreateView()仍在调用(即使onCreate()不是),并且调用getView()会返回null

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

提前致谢...

2 个答案:

答案 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恢复时,我可以连接回保留的片段以获得结果/进度。