我有一个应用程序,其中包含一个包含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中。
提前致谢。
这是典型的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?
你在后堆栈上的片段仍然存在,只是它的视图已被破坏。所以我通过将视图保存为私有变量并在从backstack恢复后重用来解决此问题:
public class MyFragment extends Fragment {
private View view;
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
if(view != null) {
return view;
}
view = inflater.inflate(R.layout.fragment_layout, container, false);
// do your view initialization here ...
return view;
}