不在屏幕上时如何不重置片段?

How can a fragment not be reset when not on screen?

我正在 Windows 10 上使用 Android Studio 开发 android 应用程序(至少对于 Marshmallow)。我的应用程序是使用 [=36] 提供的 tabbedActivity 模板创建的=] 工作室。这意味着它包含一个包含每个选项卡的 fragmentPagerAdapter 启动片段并将它们保存在内存中的 mainActivity。

我的应用是什么样子

我想做的事情:

这个应用应该是一个运动应用。在 "Run" 选项卡上,您可以在上面的 link 中看到,我连接到 Google 适合 API 并订阅了一些数据类型。 floatingActionButton 让您有机会启动一个 activity(在本例中为 运行ning),这将启动一个会话,连接到传感器并在您 运行.[=12 时显示内容=]

我希望用户在 运行ning 时能够转到另一个选项卡。当他回到 "Run" 选项卡时,一切都应该还在记录和显示中。

问题是什么:

出于某种原因,有时有效,有时无效。 如果我尝试切换到 1 个或 2 个选项卡并返回,它似乎有效。但是当我切换太多选项卡时,会出现一点冻结,Logcat 中显示一些日志,当我回来时 "Run" 选项卡重置为 0。

日志:

Skipped 90 frames! The application may be doing too much work on its main thread. D/InputTransport: Input channel constructed: fd=145 D/ViewRootImpl@fcb463d[Toast]: setView = android.widget.LinearLayout{921ae32 V.E...... ......I. 0,0-0,0} touchMode=true D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000, [697x132]-format:1 I/System.out: mExitValue 0 D/ViewRootImpl@fcb463d[Toast]: MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=1 I/System.out: (HTTPLog)-Static: isSBSettingEnabled false I/System.out: (HTTPLog)-Static: isSBSettingEnabled false I/System.out: (HTTPLog)-Static: isSBSettingEnabled false I/System.out: (HTTPLog)-Static: isSBSettingEnabled false D/ViewRootImpl@fcb463d[Toast]: dispatchDetachedFromWindow Input channel destroyed: fd=145

如果您有任何解决方案,我们将不胜感激!

经过进一步研究,我发现可以增加使用 viewpager 时默认为 1 的离屏页面数:https://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

mViewPager.setOffscreenPageLimit(4);

将其设置为 4 将使 viewpager 在内存中保留 4 个选项卡(+ 正在显示的选项卡)。 此外,它使滑动动画更加流畅,不再出现小的卡顿现象。