【问题标题】:Keep fragment view running while in back stack在后台堆栈中保持片段视图运行
【发布时间】:2017-12-12 13:55:44
【问题描述】:

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

我还有一些其他片段,例如设置,一个包含以前游乐设施的列表。我们称它们为片段 B、C、D。

当在导航视图中按下一个项目时,片段将被放置在 DrawerLayout 内的 FrameLayout 内(带有 NavigationView)。这很好用,只是当返回片段 A 时,会使用干净的地图(也就是不包含当前记录的骑行的轨迹线)和空传感器创建一个新视图。

Fragment A 总是在创建抽屉布局活动时创建。片段 B/C/D 在此基础上创建,当 onBackPressed 或在菜单中按下仪表板项时,这些片段会从返回堆栈中弹出,只剩下 A。

我的问题如下: 如何保持 Fragment A 中的视图处于活动状态/内存中,以便在访问另一个片段时继续绘制地图上的线?当我回到片段 A 时,它们还在吗?

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

提前致谢。

【问题讨论】:

    标签: android android-fragments maps


    【解决方案1】:

    这是一个典型的 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?

    【讨论】:

      【解决方案2】:

      您在后台堆栈上的片段仍然存在,只是它的视图已被破坏。 所以我通过将视图保存为私有变量并在从后台恢复后重用来解决这个问题:

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-06
        • 2021-04-09
        • 1970-01-01
        • 2014-11-04
        • 2022-12-11
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        相关资源
        最近更新 更多