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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在后台堆栈中保持片段视图运行相关的知识,希望对你有一定的参考价值。

我有一个应用程序,其中包含一个包含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;
}

The lifecycle of a fragment whenever pushed and restored from backstack

以上是关于在后台堆栈中保持片段视图运行的主要内容,如果未能解决你的问题,请参考以下文章

当 FragmentActivity 在 Android 中进入后台时出现 NotSerializableException

在后台堆栈中多次防止相同的片段

替换或删除后台堆栈上现有片段的代码不起作用

切换片段时如何维护子视图的状态?

来自后台堆栈的片段 onResume

从后台堆栈恢复片段时的 savedInstanceState