在后台堆栈中保持片段视图运行

时间:2017-12-12 13:55:44

标签: android android-fragments maps

我有一个应用程序,其中包含一个包含Google地图(SupportMapFragment)的仪表板,一些计数器由附加的传感器自动更新。他们录制自行车。我们称这个片段为A。

我还有一些其他片段,例如设置,以及之前骑行的列表。我们称它们为片段B,C,D。

当在导航视图中按下片段更改时,片段被放置在DrawerLayout(使用NavigationView)内的FrameLayout内。这样工作正常,只有当返回到片段A时,才会创建一个新视图,其中包含一个干净的地图(也就是说不包含当前记录的行程的跟踪线)和空传感器。

片段A总是在创建抽屉布局活动时创建。片段B / C / D在此处创建,当onBackPressed或菜单中的仪表板项目被按下时,这些片段从后栈中弹出,只剩下A。

我的问题如下: 如何将视图保留在Fragment A活动/内存中,以便在访问另一个片段时继续绘制地图上的线?当我回到片段A时它们仍在那里?

当我在仪表板上有一个单独的活动并在清单中使用android:launchMode="singleInstance"修饰符时,我实现了同样的目的。 我也尝试过的一件事就是将setRetainInstance(true)放在片段A中。

提前致谢。

1 个答案:

答案 0 :(得分:0)

这是典型的Android生命周期问题。一旦用另一个片段替换片段,你就无法控制片段,而Android会在后台悄悄地将其破坏。

您需要通过实现Fragment#onSaveInstanceState(Bundle)来保存片段状态,以及在重新创建Fragment时恢复状态的方法之一,例如: onCreate(Bundle),onCreateView(LayoutInflater,ViewGroup,Bundle),onActivityCreated(Bundle)或onRestoreInstanceState(Bundle)。这看起来很辛苦,但它是Android的标准做法,也是您需要实现的,例如,配置更改,其中整个活动被拆除并从头开始重新启动。

这里有一个关于如何保存/恢复片段状态的大纲: Once for all, how to correctly save instance state of Fragments in back stack?